当前位置: 首页 > Linux

Redis入门教程

时间:2023-04-06 02:14:05 Linux

一、基础知识1.1数据库在Redis中,数据库只是简单地用一个数字来标识。数据库的默认编号是0。如果你想切换到不同的数据库,你可以使用select命令来完成。在命令行界面输入select1,Redis应该回复OK信息,然后命令行界面的提示符会变成类似redis127.0.0.1:6379[1]>。如果要切换回默认数据库,只需在命令行界面中键入select0即可。1.2命令、关键字和值Redis不仅仅是一个简单的关键字-值存储。从它的核心概念来看,Redis的5种数据结构中的每一种都至少有一个关键字和一个值。键(Keys)用于标识数据块。值(Values)是与关键字关联的实际值,可以是字符串、整数、序列化对象(使用JSON、XML或其他格式)Redis命令的基本组成,如:setusers:leto"{name:leto,planet:dune,likes:[spice]}”关键字和值是Redis的基本概念,get和set命令最容易用在这个1.3的Redis查询中对于Redis来说,关键字就是一切,而值是没有意义的。Redis不允许按值查询1.4存储和持久化Redis是一种持久化的内存存储(in-memorypersistentstore)默认情况下,Redis会根据发生变化的关键字的个数进行判断,然后存储到磁盘上创建数据库的快照(snapshot)。您可以将其设置为如果X关键字已更改,则每Y秒存储一次数据库。默认情况下,如果更改了1000个或更多关键字,Redis每60秒存储一次数据库,如果更改了9个或更少关键字,则每15分钟存储一次数据库。至于存储,Redis的所有数据都会保存在内存中。显然,运行Redis的成本很高:因为RAM仍然是最昂贵的服务器硬件组件1.5总结关键字(Keys)是一个字符串值(Values),用来标识一段数据是任意字节序列,Redis我不会注意它们的本质。Redis展示(并实现)了5种专门的数据结构。以上几点让Redis快速易用,但要知道Redis并不是适合所有的应用场景。2、Redis数据key的结构不要太长,尽量不要超过1024字节,这样不仅消耗内存,还会降低查找效率。键不能太短。如果太短,键的可读性会降低。在一个项目中,key最好使用统一的命名模式,比如user:10000:passwd2.1strings127.0.0.1:6379>setmynum"2"OK127.0.0.1:6379>getmynum"2"127.0.0.1:6379>incrmynum(integer)3127.0.0.1:6379>getmynum"3"由于INCR等指令具有原子操作的特点,我们可以使用redis的INCR、INCRBY、DECR、DECRBY等指令来实现原子计数的作用,如果,在某个场景下,3个client同时读取mynum的值(值为2),然后同时给它加1,那么mynum的最终值一定是5、很多网站都是利用redis的这个特性来实现业务统计和统计的需求。2.2列表列表常用的操作有LPUSH、RPUSH、LRANGE等。我们可以用LPUSH在列表左边插入一个新元素,用RPUSH在列表右边插入一个新元素,用LRANGE命令指定从列表中提取元素的范围。//创建一个名为mylist的新列表,并在列表头部插入元素“1”127.0.0.1:6379>lpushmylist"1"//返回当前mylist的元素个数(整数)1//插入ontherightsideofmylistElement"2"127.0.0.1:6379>rpushmylist"2"(integer)2//在mylist左侧插入元素"0"127.0.0.1:6379>lpushmylist"0"(integer)3//列出mylist127.0.0.1:6379中0号到1号的元素>lrangemylist011)"0"2)"1"//列出mylist127.0中0号到1号的第一个元素.0.1:6379>lrangemylist0-11)"0"2)"1"3)"2"列表应用广泛,举几个例子:我们可以用列表来实现一个消息队列,并且可以保证顺序,不像MySQL也需要按ORDERBY排序。使用LRANGE也可以轻松实现分页功能。在博客系统中,每篇博文的评论也可以单独存放在一个列表中。2.3集合setredis的集合是一个无序集合,集合中的元素是无序的。集合相关的操作也很丰富,比如添加新元素、删除已有元素、取交、取并、取差等//向集合中添加新元素“一”myset127.0.0.1:6379>saddmyset"one"(integer)1127.0.0.1:6379>saddmyset"two"(integer)1//列出集合中的所有元素myset127.0.0.1:6379>smembersmyset1)"one"2)"two"//判断元素1是否在集合myset中,返回1表示存在127.0.0.1:6379>sismembermyset"one"(integer)1//判断元素3是否在集合myset中,返回0表示不存在of127.0.0.1:6379>sismembermyset"three"(integer)0//新建一个setyourset127.0.0.1:6379>saddyourset"1"(integer)1127.0.0.1:6379>saddyourset"2"(integer)1127.0.0.1:6379>smembersyourset1)"1"2)"2"//求两个集合的并集127.0.0.1:6379>sunionmysetyourset1)"1"2)"one"3)"2"4)“二”对于收藏的使用,也有一些常见的方式,比如QQ有个社交功能叫“好友标签”。2.4有序集sortedsetsRedis也提供了有序集(sortedsets)。有序集合中的每个元素都与一个序列号(分数)相关联,这是排序的基础。很多时候,我们把redis中的有序集称为zsets,因为在redis中,与有序集相关的操作指令都是以z开头的,比如zrange、zadd、zrevrange、zrangebyscore等//新建一个有序集myzset,并添加一个元素baidu.com,分配给它的序号是1:127.0.0.1:6379>zaddmyzset1baidu.com(integer)1//给myzset添加一个元素360.com,分配给它的序号是3127.0.0.1:6379>zaddmyzset3360.com(integer)1//在myzset中添加一个元素google.com,赋给它的编号为2127.0.0.1:6379>zaddmyzset2google.com(integer)1//列出myzset的所有元素,同时列出它们的序号,可见myzset已经有序了。127.0.0.1:6379>zrangemyzset0-1withscores1)"baidu.com"2)"1"3)"google.com"4)"2"5)"360.com"6)"3"//只列出myzset127.0.0.1:6379的元素>zrangemyzset0-11)"baidu.com"2)"google.com"3)"360.com"2.5hash散列存储字符串和字符串值之间的映射,比如一个用户想存储自己的全名、姓氏、年龄等,就很适合使用hash//构建一个hash并赋值127.0.0.1:6379>HMSETuserusernameantirezpasswordP1pp0age34OK//列出hash的内容127.0.0.1:6379>HGETALLuser1)"username"2)"antirez"3)"password"4)"P1pp0"5)"age"6)"34"//改ha某某valueinGreek127.0.0.1:6379>HSETuserpassword12345(integer)0//再次列出hash的内容127.0.0.1:6379>HGETALLuser1)"username"2)"antirez"3)"password"4)"12345"5)"age"6)"34"3、Redis持久化——RDB和AOF持久化不在入门范围。我找到了几篇不错的文章。有兴趣欢迎阅读redis持久化RDB和AOF【Redis持久化RDB和AOF对比】【redis系列:RDB持久化和AOF持久化】四、Redis.conf文件配置项redis.conf配置项解释如下:Redis默认不作为守护进程运行,你可以通过这个配置项修改,使用yes启用守护进程daemonizeno当Redis作为守护进程运行时,Redis会将pid写入/var/run/redis.pid默认为file,可以通过pidfile指定pidfile/var/run/redis.pid指定Redis监听端口。默认端口是6379,这里有个故事,因为6379是手机按键上MERZ对应的号码,MERZ取从意大利歌手AlessiaMerz的名字6379端口绑定的主机地址是bind127.0.0.1。当客户端长时间空闲时,连接将被关闭。如果指定为0,则意味着该函数将被关闭。timeout30指定日志记录级别,Redis一共支持四种Level:debug、verbose、notice、warning,默认为verboseloglevel详细日志记录方式,默认为标准输出,如果Redis配置为守护进程运行,以及日志记录模式在这里配置为标准输出,日志将被发送到/dev/nulllogfilestdout设置数据库的数量。默认数据库为0。您可以使用SELECT命令指定连接上的数据库iddatabases。16指定将数据同步到数据文件的时间段和更新操作次数。多个条件可以结合saveRedis默认配置文件中提供了三个条件:`save9001save30010save6010000`表示900秒(15分钟)内有1次变化,和300秒10次变化(5分钟)和10000次变化60秒指定存储到本地数据库时是否压缩数据。默认为是。Redis使用LZF压缩。如果想节省CPU时间,可以关闭这个选项,但是会导致数据库文件变得巨大。rdbcompressionyes指定本地数据库文件名,默认为dump.rdbdbfilenamedump.rdb指定本地数据库存放目录`dir./`本地机器做slav时设置,设置master服务的IP地址和端口,Redis启动时,会自动从master同步数据`slaveof`当master服务有密码保护时,slav服务连接master的密码`masterauth`设置了Redis连接密码。如果配置了连接密码,客户端需要通过AUTH<连接Redis时的密码>命令提供密码,默认禁用`requirepassfoobared`。设置客户端同时连接的最大数量。默认是无限的。Redis可以同时打开的客户端连接数就是Redis进程可以打开的最大文件描述符数。如果设置maxclients为0,表示没有限制。当客户端连接数达到限制时,Redis将关闭新连接,并向客户端返回maxnumberofclientsreached错误信息。maxclients128指定了Redis的最大内存限制,Redis在启动时会将数据加载到内存中,达到最大内存后,Redis会先尝试清除过期或即将过期的Key。该方法处理时,仍然达到最大内存设置,无法进行写操作,但仍然可以进行读操作。Redis新的vm机制会将Key存放在内存中,而Value会存放在交换区maxmemory中,以指定每次更新操作后是否进行日志记录。默认情况下,Redis将数据异步写入磁盘。如果不这样做,可能会在断电的情况下导致数据丢失一段时间。因为redis本身是按照上面的save条件来同步数据文件的,所以有些数据只会在内存中存在一段时间。默认为noappendonlyno指定更新日志文件名,默认为appendonly.aofappendfilenameappendonly.aof指定更新日志条件,有3个可选值:no:表示等待操作系统将数据缓存同步到磁盘(快)always:表示每次更新操作后,手动调用fsync()将数据写入磁盘(慢,安全)everysec:表示每秒同步一次(妥协,默认值)appendfsynceverysec指定是否启用虚拟memory机制,默认为no,简单介绍,VM机制以页为单位存储数据,Redis将访问少的页即冷数据交换到磁盘,访问多的页自动交换从磁盘到内存。vm-enabled无虚拟内存文件路径,默认值为/tmp/redis.swap,不能被多个Redis实例共享内存,不管vm-max-memory设置的多小,所有的索引数据都存储在内存中(redis索引数据是keys),也就是说当vm-max-memory设置为0时,所有的值实际上存在于磁盘上。默认值为0vm-max-memory0。Redis交换文件被分成很多页。一个对象可以存储在多个页面上,但一个页面不能被多个对象共享。vm-page-size是根据存储数据的大小来设置的,笔者建议如果存储的小对象较多,页面大小应设置为32或64字节;如果存储非常大的对象,可以使用更大的页面,如果不确定,使用默认值vm-page-size32设置交换文件中的页数。由于页表(表示页空闲或已用的位图)是放在内存中的,所以磁盘上每8页就会消耗1字节的内存。vm-pages134217728设置访问交换文件的线程数。最好不要超过机器的核心数。如果设置为0,则对交换文件的所有操作都是串行的,这可能会导致较长的延迟。默认值为4vm-max-threads4.响应客户端时,是否将较小的数据包合并为一个数据包发送。默认是开启glueoutputbufyes来指定当数量超过一定数量或者最大元素超过一定阈值时,使用特殊的hash算法`hash-max-zipmap-entries64hash-max-zipmap-value512`指定是否激活resethashing,默认是开启activerehashingyes指定包含其他配置文件,可以includein同一个主机上的多个Redis实例使用同一个配置文件,而每个实例都有自己特定的配置文件include/path/to/local.conf什么是守护进程?DaemonProcess,又称守护进程(elf进程),是Linux中的一个后台服务进程。它是一个长期存在的进程,通常独立于控制终端,定期执行某些任务或等待某些事件发生。守护进程是一个特殊的孤儿进程。这种进程与终端分离。为什么要和终端分开呢?之所以与终端分离,是为了避免进程被任何终端产生的信息打断,执行过程中的信息不显示在任何终端上。因为在linux中,系统与用户通信的每一个接口都被称为终端,每一个从这个终端开始运行的进程都会依附在这个终端上,而这个终端又被称为这些进程的控制终端。当控制终端关闭时,相应的进程也会自动关闭。五、事务处理MULTI、EXEC、DISCARD、WATCH指令构成redis事务处理的基础MULTI用于组装一个事务;EXEC用于执行事务;DISCARD用于取消交易;WATCH用于监控一些键,一旦在交易执行前更改了这些键,则交易的执行被取消。搜索并关注微信公众号:ID:bbcoins