设为首页 收藏本站
查看: 1154|回复: 0

[经验分享] redis服务安装、配置、使用

[复制链接]

尚未签到

发表于 2018-11-7 11:02:59 | 显示全部楼层 |阅读模式
  Redis适用场合
  1、取最新的N个数据的操作
  2、排行榜应用,取TOP N操作
  3、需要精确设定过期的时间的应用
  4、计数器应用
  5、Uniq操作,获取某段时间内所有数据的排重值
  6、实时系统,反垃圾系统
  Redis 安装配置
下载地址http://redis.googlecode.com/files/redis-2.4.18.tar.gztar –zxvf redis-2.4.18.tar.gzcd redis-2.4.18makecd src && make install默认情况下将redis的一些可执行文件安装在/usr/local/bin下,新建目录mkdir -p /data/program/redis/binmkdir -p /data/program/redis/etcmkdir -p /data/program/redis/logstouch /data/program/redis/logs/redis.logmv /usr/local/bin/redis* /data/program/redis/bincp /src/redis.conf /data/program/redis/etc启动redis:/data/program/redis/bin/redis-server /data/program/redis/etc/redis.confnetstat –anlp | grep :6379 验证redis是否启动关闭redis/data/program/redis/bin/redis-cli shutdownRedis 状态与性能监控redis-benchmark –h localhost –p 6379 –c 100 –n 100000100个并发,100000个请求redis服务器的响应时间redis-cli –h localhost –p 6379 monitor监控redis的连接及读写操作redis-cli –h localhost –p 6379 info提供redis服务的统计信息  redis的配置文件参数--详细说明
  1. Redis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进程
  daemonize no
  2. 当Redis以守护进程方式运行时,Redis默认会把pid写入/var/run/redis.pid文件,可以通过pidfile指定
  pidfile /var/run/redis.pid
  3. 指定Redis监听端口,默认端口为6379,作者在自己的一篇博文中解释了为什么选用6379作为默认端口,因为6379在手机按键上MERZ对应的号码,而MERZ取自意大利歌女Alessia Merz的名字
  port 6379
  4. 绑定的主机地址
  bind 127.0.0.1
  5.当 客户端闲置多长时间后关闭连接,如果指定为0,表示关闭该功能
  timeout 300
  6. 指定日志记录级别,Redis总共支持四个级别:debug、verbose、notice、warning,默认为verbose
  loglevel verbose
  7. 日志记录方式,默认为标准输出,如果配置Redis为守护进程方式运行,而这里又配置为日志记录方式为标准输出,则日志将会发送给/dev/null
  logfile stdout
  8. 设置数据库的数量,默认数据库为0,可以使用SELECT命令在连接上指定数据库id
  databases 16
  9. 指定在多长时间内,有多少次更新操作,就将数据同步到数据文件,可以多个条件配合
  save  
  Redis默认配置文件中提供了三个条件:
  save 900 1
  save 300 10
  save 60 10000
  分别表示900秒(15分钟)内有1个更改,300秒(5分钟)内有10个更改以及60秒内有10000个更改。
  10. 指定存储至本地数据库时是否压缩数据,默认为yes,Redis采用LZF压缩,如果为了节省CPU时间,可以关闭该选项,但会导致数据库文件变的巨大
  rdbcompression yes
  11. 指定本地数据库文件名,默认值为dump.rdb
  dbfilename dump.rdb
  12. 指定本地数据库存放目录
  dir ./
  13. 设置当本机为slav服务时,设置master服务的IP地址及端口,在Redis启动时,它会自动从master进行数据同步
  slaveof  
  14. 当master服务设置了密码保护时,slav服务连接master的密码
  masterauth
  15. 设置Redis连接密码,如果配置了连接密码,客户端在连接Redis时需要通过AUTH 命令提供密码,默认关闭
  requirepass foobared
  16. 设置同一时间最大客户端连接数,默认无限制,Redis可以同时打开的客户端连接数为Redis进程可以打开的最大文件描述符数,如果设置 maxclients 0,表示不作限制。当客户端连接数到达限制时,Redis会关闭新的连接并向客户端返回max number of clientsreached错误信息
  maxclients 128
  17. 指定Redis最大内存限制,Redis在启动时会把数据加载到内存中,达到最大内存后,Redis会先尝试清除已到期或即将到期的Key,当此方法处理 后,仍然到达最大内存设置,将无法再进行写入操作,但仍然可以进行读取操作。Redis新的vm机制,会把Key存放内存,Value会存放在swap区
  maxmemory
  18. 指定是否在每次更新操作后进行日志记录,Redis在默认情况下是异步的把数据写入磁盘,如果不开启,可能会在断电时导致一段时间内的数据丢失。因为 redis本身同步数据文件是按上面save条件来同步的,所以有的数据会在一段时间内只存在于内存中。默认为no
  appendonly no
  19. 指定更新日志文件名,默认为appendonly.aof
  appendfilename appendonly.aof
  20. 指定更新日志条件,共有3个可选值:
  no:表示等操作系统进行数据缓存同步到磁盘(快)
  always:表示每次更新操作后手动调用fsync()将数据写到磁盘(慢,安全)
  everysec:表示每秒同步一次(折衷,默认值)
  appendfsync everysec
  21. 指定是否启用虚拟内存机制,默认值为no,简单的介绍一下,VM机制将数据分页存放,由Redis将访问量较少的页即冷数据swap到磁盘上,访问多的页面由磁盘自动换出到内存中(在后面的文章我会仔细分析Redis的VM机制)
  vm-enabled no
  22. 虚拟内存文件路径,默认值为/tmp/redis.swap,不可多个Redis实例共享
  vm-swap-file /tmp/redis.swap
  23. 将所有大于vm-max-memory的数据存入虚拟内存,无论vm-max-memory设置多小,所有索引数据都是内存存储的(Redis的索引数据 就是keys),也就是说,当vm-max-memory设置为0的时候,其实是所有value都存在于磁盘。默认值为0
  vm-max-memory 0
  24. Redis swap文件分成了很多的page,一个对象可以保存在多个page上面,但一个page上不能被多个对象共享,vm-page-size是要根据存储的 数据大小来设定的,作者建议如果存储很多小对象,page大小最好设置为32或者64bytes;如果存储很大大对象,则可以使用更大的page,如果不 确定,就使用默认值
  vm-page-size 32
  25. 设置swap文件中的page数量,由于页表(一种表示页面空闲或使用的bitmap)是在放在内存中的,,在磁盘上每8个pages将消耗1byte的内存。
  vm-pages 134217728
  26. 设置访问swap文件的线程数,最好不要超过机器的核数,如果设置为0,那么所有对swap文件的操作都是串行的,可能会造成比较长时间的延迟。默认值为4
  vm-max-threads 4
  27. 设置在向客户端应答时,是否把较小的包合并为一个包发送,默认为开启
  glueoutputbuf yes
  28. 指定在超过一定的数量或者最大的元素超过某一临界值时,采用一种特殊的哈希算法
  hash-max-zipmap-entries 64
  hash-max-zipmap-value 512
  29. 指定是否激活重置哈希,默认为开启(后面在介绍Redis的哈希算法时具体介绍)
  activerehashing yes
  30. 指定包含其它的配置文件,可以在同一主机上多个Redis实例之间使用同一份配置文件,而同时各个实例又拥有自己的特定配置文件
  include /path/to/local.conf
  命令示例:
  1. SET/GET/APPEND/STRLEN:
  />redis-cli #执行Redis客户端工具。
  redis 127.0.0.1:6379> exists mykey #判断该键是否存在,存在返回1,否则返回0。
  (integer) 0
  redis 127.0.0.1:6379> append mykey "hello"#该键并不存在,因此append命令返回当前Value的长度。
  (integer) 5
  redis 127.0.0.1:6379> append mykey " world" #该键已经存在,因此返回追加后Value的长度。
  (integer) 11
  redis 127.0.0.1:6379> get mykey #通过get命令获取该键,以判断append的结果。
  "hello world"
  redis 127.0.0.1:6379> set mykey "this is a test"#通过set命令为键设置新值,并覆盖原有值。
  OK
  redis 127.0.0.1:6379> get mykey
  "this is a test"
  redis 127.0.0.1:6379> strlen mykey #获取指定Key的字符长度,等效于C库中strlen函数。
  (integer) 14
  2. INCR/DECR/INCRBY/DECRBY:
  redis 127.0.0.1:6379> set mykey 20#设置Key的值为20
  OK
  redis 127.0.0.1:6379> incr mykey#该Key的值递增1
  (integer) 21
  redis 127.0.0.1:6379> decr mykey #该Key的值递减1
  (integer) 20
  redis 127.0.0.1:6379> del mykey #删除已有键。
  (integer) 1
  redis 127.0.0.1:6379> decr mykey #对空值执行递减操作,其原值被设定为0,递减后的值为-1
  (integer) -1
  redis 127.0.0.1:6379> del mykey
  (integer) 1
  redis 127.0.0.1:6379> incr mykey #对空值执行递增操作,其原值被设定为0,递增后的值为1
  (integer) 1
  redis 127.0.0.1:6379> set mykey hello#将该键的Value设置为不能转换为整型的普通字符串。
  OK
  redis 127.0.0.1:6379> incr mykey #在该键上再次执行递增操作时,Redis将报告错误信息。
  (error) ERR value is not an integer or out of range
  redis 127.0.0.1:6379> set mykey 10
  OK
  redis 127.0.0.1:6379> decrby mykey 5
  (integer) 5
  redis 127.0.0.1:6379> incrby mykey 10
  (integer) 15
  3. GETSET:
  redis 127.0.0.1:6379> incr mycounter #将计数器的值原子性的递增1
  (integer) 1
  #在获取计数器原有值的同时,并将其设置为新值,这两个操作原子性的同时完成。
  redis 127.0.0.1:6379> getset mycounter 0
  "1"
  redis 127.0.0.1:6379> get mycounter#查看设置后的结果。
  "0"
  4. SETEX:
  redis 127.0.0.1:6379> setex mykey 10 "hello" #设置指定Key的过期时间为10秒。
  OK
  #通过ttl命令查看一下指定Key的剩余存活时间(秒数),0表示已经过期,-1表示永不过期。
  redis 127.0.0.1:6379> ttl mykey
  (integer) 4
  redis 127.0.0.1:6379> get mykey #在该键的存活期内我们仍然可以获取到它的Value。
  "hello"
  redis 127.0.0.1:6379> ttl mykey#该ttl命令的返回值显示,该Key已经过期。
  (integer) 0
  redis 127.0.0.1:6379> get mykey#获取已过期的Key将返回nil。
  (nil)
  5. SETNX:
  redis 127.0.0.1:6379> del mykey #删除该键,以便于下面的测试验证。
  (integer) 1
  redis 127.0.0.1:6379> setnx mykey "hello" #该键并不存在,因此该命令执行成功。
  (integer) 1
  redis 127.0.0.1:6379> setnx mykey "world" #该键已经存在,因此本次设置没有产生任何效果。
  (integer) 0
  redis 127.0.0.1:6379> get mykey#从结果可以看出,返回的值仍为第一次设置的值。
  "hello"
  6. SETRANGE/GETRANGE:
  redis 127.0.0.1:6379> set mykey "hello world" #设定初始值。
  OK
  redis 127.0.0.1:6379> setrange mykey 6 dd #从第六个字节开始替换2个字节(dd只有2个字节)
  (integer) 11
  redis 127.0.0.1:6379> get mykey #查看替换后的值。
  "hello ddrld"
  redis 127.0.0.1:6379> setrange mykey 20 dd#offset已经超过该Key原有值的长度了,该命令将会在末尾补0。
  (integer) 22
  redis 127.0.0.1:6379> get mykey#查看补0后替换的结果。
  "hello ddrld\x00\x00\x00\x00\x00\x00\x00\x00\x00dd"
  redis 127.0.0.1:6379> del mykey#删除该Key。
  (integer) 1
  redis 127.0.0.1:6379> setrange mykey 2 dd#替换空值。
  (integer) 4
  redis 127.0.0.1:6379> get mykey#查看替换空值后的结果。
  "\x00\x00dd"
  redis 127.0.0.1:6379> set mykey "0123456789" #设置新值。
  OK
  redis 127.0.0.1:6379> getrange mykey 1 2 #截取该键的Value,从第一个字节开始,到第二个字节结束。
  "12"
  redis 127.0.0.1:6379> getrange mykey 1 20 #20已经超过Value的总长度,因此将截取第一个字节后面的所有字节。
  "123456789"
  7. SETBIT/GETBIT:
  redis 127.0.0.1:6379> del mykey
  (integer) 1
  redis 127.0.0.1:6379> setbit mykey 7 1#设置从0开始计算的第七位BIT值为1,返回原有BIT值0
  (integer) 0
  redis 127.0.0.1:6379> get mykey#获取设置的结果,二进制的0000 0001的十六进制值为0x01
  "\x01"
  redis 127.0.0.1:6379> setbit mykey 6 1#设置从0开始计算的第六位BIT值为1,返回原有BIT值0
  (integer) 0
  redis 127.0.0.1:6379> get mykey#获取设置的结果,二进制的0000 0011的十六进制值为0x03
  "\x03"
  redis 127.0.0.1:6379> getbit mykey 6 #返回了指定Offset的BIT值。
  (integer) 1
  redis 127.0.0.1:6379> getbit mykey 10 #Offset已经超出了value的长度,因此返回0。
  (integer) 0
  8. MSET/MGET/MSETNX:
  redis 127.0.0.1:6379> mset key1 "hello" key2"world"#批量设置了key1和key2两个键。
  OK
  redis 127.0.0.1:6379> mget key1 key2#批量获取了key1和key2两个键的值。
  1) "hello"
  2) "world"
  #批量设置了key3和key4两个键,因为之前他们并不存在,所以该命令执行成功并返回1。
  redis 127.0.0.1:6379> msetnx key3 "stephen" key4"liu"
  (integer) 1
  redis 127.0.0.1:6379> mget key3 key4
  1) "stephen"
  2) "liu"
  #批量设置了key3和key5两个键,但是key3已经存在,所以该命令执行失败并返回0。
  redis 127.0.0.1:6379> msetnx key3 "hello" key5"world"
  (integer) 0
  #批量获取key3和key5,由于key5没有设置成功,所以返回nil。
  redis 127.0.0.1:6379> mget key3 key5
  1) "stephen"
  2) (nil)
  list概述:
  在Redis中,List类型是按照插入顺序排序的字符串链表。和数据结构中的普通链表一样,我们可以在其头部(left)和尾部(right)添加新的元素。在插入时,如果该键并不存在,Redis将为该键创建一个新的链表。与此相反,如果链表中所有的元素均被移除,那么该键也将会被从数据库中删除。List中可以包含的最大元素数量是4294967295。
  从元素插入和删除的效率视角来看,如果我们是在链表的两头插入或删除元素,这将会是非常高效的操作,即使链表中已经存储了百万条记录,该操作也可以在常量时间内完成。然而需要说明的是,如果元素插入或删除操作是作用于链表中间,那将会是非常低效的。相信对于有良好数据结构基础的开发者而言,这一点并不难理解。
  命令示例:
  1. LPUSH/LPUSHX/LRANGE:
  /> redis-cli#在Shell提示符下启动redis客户端工具。
  redis 127.0.0.1:6379> del mykey
  (integer) 1
  #mykey键并不存在,该命令会创建该键及与其关联的List,之后在将参数中的values从左到右依次插入。
  redis 127.0.0.1:6379> lpush mykey a b c d
  (integer) 4
  #取从位置0开始到位置2结束的3个元素。
  redis 127.0.0.1:6379> lrange mykey 0 2
  1) "d"
  2) "c"
  3) "b"
  #取链表中的全部元素,其中0表示第一个元素,-1表示最后一个元素。
  redis 127.0.0.1:6379> lrange mykey 0 -1
  1) "d"
  2) "c"
  3) "b"
  4) "a"
  #mykey2键此时并不存在,因此该命令将不会进行任何操作,其返回值为0。
  redis 127.0.0.1:6379> lpushx mykey2 e
  (integer) 0
  #可以看到mykey2没有关联任何List Value。
  redis 127.0.0.1:6379> lrange mykey2 0 -1
  (empty list or set)
  #mykey键此时已经存在,所以该命令插入成功,并返回链表中当前元素的数量。
  redis 127.0.0.1:6379> lpushx mykey e
  (integer) 5
  #获取该键的List Value的头部元素。
  redis 127.0.0.1:6379> lrange mykey 0 0
  1) "e"
  2. LPOP/LLEN:
  redis 127.0.0.1:6379> lpush mykey a b c d
  (integer) 4
  redis 127.0.0.1:6379> lpop mykey
  "d"
  redis 127.0.0.1:6379> lpop mykey
  "c"
  #在执行lpop命令两次后,链表头部的两个元素已经被弹出,此时链表中元素的数量是2
  redis 127.0.0.1:6379> llen mykey
  (integer) 2
  3. LREM/LSET/LINDEX/LTRIM:
  #为后面的示例准备测试数据。
  redis 127.0.0.1:6379> lpush mykey a b c d a c
  (integer) 6
  #从头部(left)向尾部(right)变量链表,删除2个值等于a的元素,返回值为实际删除的数量。
  redis 127.0.0.1:6379> lrem mykey 2 a
  (integer) 2
  #看出删除后链表中的全部元素。
  redis 127.0.0.1:6379> lrange mykey 0 -1
  1) "c"
  2) "d"
  3) "c"
  4) "b"
  #获取索引值为1(头部的第二个元素)的元素值。
  redis 127.0.0.1:6379> lindex mykey 1
  "d"
  #将索引值为1(头部的第二个元素)的元素值设置为新值e。
  redis 127.0.0.1:6379> lset mykey 1 e
  OK
  #查看是否设置成功。
  redis 127.0.0.1:6379> lindex mykey 1
  "e"
  #索引值6超过了链表中元素的数量,该命令返回nil。
  redis 127.0.0.1:6379> lindex mykey 6
  (nil)
  #设置的索引值6超过了链表中元素的数量,设置失败,该命令返回错误信息。
  redis 127.0.0.1:6379> lset mykey 6 hh
  (error) ERR index out of range
  #仅保留索引值0到2之间的3个元素,注意第0个和第2个元素均被保留。
  redis 127.0.0.1:6379> ltrim mykey 0 2
  OK
  #查看trim后的结果。
  redis 127.0.0.1:6379> lrange mykey 0 -1
  1) "c"
  2) "e"
  3) "c"
  4. LINSERT:
  #删除该键便于后面的测试。
  redis 127.0.0.1:6379> del mykey
  (integer) 1
  #为后面的示例准备测试数据。
  redis 127.0.0.1:6379> lpush mykey a b c d e
  (integer) 5
  #在a的前面插入新元素a1。
  redis 127.0.0.1:6379> linsert mykey before a a1
  (integer) 6
  #查看是否插入成功,从结果看已经插入。注意lindex的index值是0-based。
  redis 127.0.0.1:6379> lindex mykey 0
  "e"
  #在e的后面插入新元素e2,从返回结果看已经插入成功。
  redis 127.0.0.1:6379> linsert mykey after e e2
  (integer) 7
  #再次查看是否插入成功。
  redis 127.0.0.1:6379> lindex mykey 1
  "e2"
  #在不存在的元素之前或之后插入新元素,该命令操作失败,并返回-1。
  redis 127.0.0.1:6379> linsert mykey after k a
  (integer) -1
  #为不存在的Key插入新元素,该命令操作失败,返回0。
  redis 127.0.0.1:6379> linsert mykey1 after a a2
  (integer) 0
  5. RPUSH/RPUSHX/RPOP/RPOPLPUSH:
  #删除该键,以便于后面的测试。
  redis 127.0.0.1:6379> del mykey
  (integer) 1
  #从链表的尾部插入参数中给出的values,插入顺序是从左到右依次插入。
  redis 127.0.0.1:6379> rpush mykey a b c d
  (integer) 4
  #通过lrange的可以获悉rpush在插入多值时的插入顺序。
  redis 127.0.0.1:6379> lrange mykey 0 -1
  1) "a"
  2) "b"
  3) "c"
  4) "d"
  #该键已经存在并且包含4个元素,rpushx命令将执行成功,并将元素e插入到链表的尾部。
  redis 127.0.0.1:6379> rpushx mykey e
  (integer) 5
  #通过lindex命令可以看出之前的rpushx命令确实执行成功,因为索引值为4的元素已经是新元素了。
  redis 127.0.0.1:6379> lindex mykey 4
  "e"
  #由于mykey2键并不存在,因此该命令不会插入数据,其返回值为0。
  redis 127.0.0.1:6379> rpushx mykey2 e
  (integer) 0
  #在执行rpoplpush命令前,先看一下mykey中链表的元素有哪些,注意他们的位置关系。
  redis 127.0.0.1:6379> lrange mykey 0 -1
  1) "a"
  2) "b"
  3) "c"
  4) "d"
  5) "e"
  #将mykey的尾部元素e弹出,同时再插入到mykey2的头部(原子性的完成这两步操作)。
  redis 127.0.0.1:6379> rpoplpush mykey mykey2
  "e"
  #通过lrange命令查看mykey在弹出尾部元素后的结果。
  redis 127.0.0.1:6379> lrange mykey 0 -1
  1) "a"
  2) "b"
  3) "c"
  4) "d"
  #通过lrange命令查看mykey2在插入元素后的结果。
  redis 127.0.0.1:6379> lrange mykey2 0 -1
  1) "e"
  #将source和destination设为同一键,将mykey中的尾部元素移到其头部。
  redis 127.0.0.1:6379> rpoplpush mykey mykey
  "d"
  #查看移动结果。
  redis 127.0.0.1:6379> lrange mykey 0 -1
  1) "d"
  2) "a"
  3) "b"
  4) "c"
  hash概述:
  我们可以将Redis中的Hashes类型看成具有String Key和String Value的map容器。所以该类型非常适合于存储值对象的信息。如Username、Password和Age等。如果Hash中包含很少的字段,那么该类型的数据也将仅占用很少的磁盘空间。每一个Hash可以存储4294967295个键值对。
  命令示例:
  1. HSET/HGET/HDEL/HEXISTS/HLEN/HSETNX:
  #在Shell命令行启动Redis客户端程序
  /> redis-cli
  #给键值为myhash的键设置字段为field1,值为stephen。
  redis 127.0.0.1:6379> hset myhash field1 "stephen"
  (integer) 1
  #获取键值为myhash,字段为field1的值。
  redis 127.0.0.1:6379> hget myhash field1
  "stephen"
  #myhash键中不存在field2字段,因此返回nil。
  redis 127.0.0.1:6379> hget myhash field2
  (nil)
  #给myhash关联的Hashes值添加一个新的字段field2,其值为liu。
  redis 127.0.0.1:6379> hset myhash field2 "liu"
  (integer) 1
  #获取myhash键的字段数量。
  redis 127.0.0.1:6379> hlen myhash
  (integer) 2
  #判断myhash键中是否存在字段名为field1的字段,由于存在,返回值为1。
  redis 127.0.0.1:6379> hexists myhash field1
  (integer) 1
  #删除myhash键中字段名为field1的字段,删除成功返回1。
  redis 127.0.0.1:6379> hdel myhash field1
  (integer) 1
  #再次删除myhash键中字段名为field1的字段,由于上一条命令已经将其删除,因为没有删除,返回0。
  redis 127.0.0.1:6379> hdel myhash field1
  (integer) 0
  #判断myhash键中是否存在field1字段,由于上一条命令已经将其删除,因为返回0。
  redis 127.0.0.1:6379> hexists myhash field1
  (integer) 0
  #通过hsetnx命令给myhash添加新字段field1,其值为stephen,因为该字段已经被删除,所以该命令添加成功并返回1。
  redis 127.0.0.1:6379> hsetnx myhash field1 stephen
  (integer) 1
  #由于myhash的field1字段已经通过上一条命令添加成功,因为本条命令不做任何操作后返回0。
  redis 127.0.0.1:6379> hsetnx myhash field1 stephen
  (integer) 0
  2. HINCRBY:
  #删除该键,便于后面示例的测试。
  redis 127.0.0.1:6379> del myhash
  (integer) 1
  #准备测试数据,该myhash的field字段设定值1。
  redis 127.0.0.1:6379> hset myhash field 5
  (integer) 1
  #给myhash的field字段的值加1,返回加后的结果。
  redis 127.0.0.1:6379> hincrby myhash field 1
  (integer) 6
  #给myhash的field字段的值加-1,返回加后的结果。
  redis 127.0.0.1:6379> hincrby myhash field -1
  (integer) 5
  #给myhash的field字段的值加-10,返回加后的结果。
  redis 127.0.0.1:6379> hincrby myhash field -10
  (integer) -5
  3. HGETALL/HKEYS/HVALS/HMGET/HMSET:
  #删除该键,便于后面示例测试。
  redis 127.0.0.1:6379> del myhash
  (integer) 1
  #为该键myhash,一次性设置多个字段,分别是field1 ="hello", field2 = "world"。
  redis 127.0.0.1:6379> hmset myhash field1 "hello" field2"world"
  OK
  #获取myhash键的多个字段,其中field3并不存在,因为在返回结果中与该字段对应的值为nil。
  redis 127.0.0.1:6379> hmget myhash field1 field2 field3
  1) "hello"
  2) "world"
  3) (nil)
  #返回myhash键的所有字段及其值,从结果中可以看出,他们是逐对列出的。
  redis 127.0.0.1:6379> hgetall myhash
  1) "field1"
  2) "hello"
  3) "field2"
  4) "world"
  #仅获取myhash键中所有字段的名字。
  redis 127.0.0.1:6379> hkeys myhash
  1) "field1"
  2) "field2"
  #仅获取myhash键中所有字段的值。
  redis 127.0.0.1:6379> hvals myhash
  1) "hello"
  2) "world"
  set概述:
  在Redis中,我们可以将Set类型看作为没有排序的字符集合,和List类型一样,我们也可以在该类型的数据值上执行添加、删除或判断某一元素是否存在等操作。需要说明的是,这些操作的时间复杂度为O(1),即常量时间内完成次操作。Set可包含的最大元素数量是4294967295。
  和List类型不同的是,Set集合中不允许出现重复的元素,这一点和C++标准库中的set容器是完全相同的。换句话说,如果多次添加相同元素,Set中将仅保留该元素的一份拷贝。和List类型相比,Set类型在功能上还存在着一个非常重要的特性,即在服务器端完成多个Sets之间的聚合计算操作,如unions、intersections和differences。由于这些操作均在服务端完成,因此效率极高,而且也节省了大量的网络IO开销。
  命令示例:
  1. SADD/SMEMBERS/SCARD/SISMEMBER:
  #在Shell命令行下启动Redis的客户端程序。
  /> redis-cli
  #插入测试数据,由于该键myset之前并不存在,因此参数中的三个成员都被正常插入。
  redis 127.0.0.1:6379> sadd myset a b c
  (integer) 3
  #由于参数中的a在myset中已经存在,因此本次操作仅仅插入了d和e两个新成员。
  redis 127.0.0.1:6379> sadd myset a d e
  (integer) 2
  #判断a是否已经存在,返回值为1表示存在。
  redis 127.0.0.1:6379> sismember myset a
  (integer) 1
  #判断f是否已经存在,返回值为0表示不存在。
  redis 127.0.0.1:6379> sismember myset f
  (integer) 0
  #通过smembers命令查看插入的结果,从结果可以,输出的顺序和插入顺序无关。
  redis 127.0.0.1:6379> smembers myset
  1) "c"
  2) "d"
  3) "a"
  4) "b"
  5) "e"
  #获取Set集合中元素的数量。
  redis 127.0.0.1:6379> scard myset
  (integer) 5
  2. SPOP/SREM/SRANDMEMBER/SMOVE:
  #删除该键,便于后面的测试。
  redis 127.0.0.1:6379> del myset
  (integer) 1
  #为后面的示例准备测试数据。
  redis 127.0.0.1:6379> sadd myset a b c d
  (integer) 4
  #查看Set中成员的位置。
  redis 127.0.0.1:6379> smembers myset
  1) "c"
  2) "d"
  3) "a"
  4) "b"
  #从结果可以看出,该命令确实是随机的返回了某一成员。
  redis 127.0.0.1:6379> srandmember myset
  "c"
  #Set中尾部的成员b被移出并返回,事实上b并不是之前插入的第一个或最后一个成员。
  redis 127.0.0.1:6379> spop myset
  "b"
  #查看移出后Set的成员信息。
  redis 127.0.0.1:6379> smembers myset
  1) "c"
  2) "d"
  3) "a"
  #从Set中移出a、d和f三个成员,其中f并不存在,因此只有a和d两个成员被移出,返回为2。
  redis 127.0.0.1:6379> srem myset a d f
  (integer) 2
  #查看移出后的输出结果。
  redis 127.0.0.1:6379> smembers myset
  1) "c"
  #为后面的smove命令准备数据。
  redis 127.0.0.1:6379> sadd myset a b
  (integer) 2
  redis 127.0.0.1:6379> sadd myset2 c d
  (integer) 2
  #将a从myset移到myset2,从结果可以看出移动成功。
  redis 127.0.0.1:6379> smove myset myset2 a
  (integer) 1
  #再次将a从myset移到myset2,由于此时a已经不是myset的成员了,因此移动失败并返回0。
  redis 127.0.0.1:6379> smove myset myset2 a
  (integer) 0
  #分别查看myset和myset2的成员,确认移动是否真的成功。
  redis 127.0.0.1:6379> smembers myset
  1) "b"
  redis 127.0.0.1:6379> smembers myset2
  1) "c"
  2) "d"
  3) "a"
  3. SDIFF/SDIFFSTORE/SINTER/SINTERSTORE:
  #为后面的命令准备测试数据。
  redis 127.0.0.1:6379> sadd myset a b c d
  (integer) 4
  redis 127.0.0.1:6379> sadd myset2 c
  (integer) 1
  redis 127.0.0.1:6379> sadd myset3 a c e
  (integer) 3
  #myset和myset2相比,a、b和d三个成员是两者之间的差异成员。再用这个结果继续和myset3进行差异比较,b和d是myset3不存在的成员。
  redis 127.0.0.1:6379> sdiff myset myset2 myset3
  1) "d"
  2) "b"
  #将3个集合的差异成员存在在diffkey关联的Set中,并返回插入的成员数量。
  redis 127.0.0.1:6379> sdiffstore diffkey myset myset2 myset3
  (integer) 2
  #查看一下sdiffstore的操作结果。
  redis 127.0.0.1:6379> smembers diffkey
  1) "d"
  2) "b"
  #从之前准备的数据就可以看出,这三个Set的成员交集只有c。
  redis 127.0.0.1:6379> sinter myset myset2 myset3
  1) "c"
  #将3个集合中的交集成员存储到与interkey关联的Set中,并返回交集成员的数量。
  redis 127.0.0.1:6379> sinterstore interkey myset myset2 myset3
  (integer) 1
  #查看一下sinterstore的操作结果。
  redis 127.0.0.1:6379> smembers interkey
  1) "c"
  #获取3个集合中的成员的并集。
  redis 127.0.0.1:6379> sunion myset myset2 myset3
  1) "b"
  2) "c"
  3) "d"
  4) "e"
  5) "a"
  #将3个集合中成员的并集存储到unionkey关联的set中,并返回并集成员的数量。
  redis 127.0.0.1:6379> sunionstore unionkey myset myset2 myset3
  (integer) 5
  #查看一下suiionstore的操作结果。
  redis 127.0.0.1:6379> smembers unionkey
  1) "b"
  2) "c"
  3) "d"
  4) "e"
  5) "a"
  应用范围:
  1). 可以使用Redis的Set数据类型跟踪一些唯一性数据,比如访问某一博客的唯一IP地址信息。对于此场景,我们仅需在每次访问该博客时将访问者的IP存入Redis中,Set数据类型会自动保证IP地址的唯一性。
  2). 充分利用Set类型的服务端聚合操作方便、高效的特性,可以用于维护数据对象之间的关联关系。比如所有购买某一电子设备的客户ID被存储在一个指定的Set中,而购买另外一种电子产品的客户ID被存储在另外一个Set中,如果此时我们想获取有哪些客户同时购买了这两种商品时,Set的intersections命令就可以充分发挥它的方便和效率的优势了。
  zset概述:
  Sorted-Sets和Sets类型极为相似,它们都是字符串的集合,都不允许重复的成员出现在一个Set中。它们之间的主要差别是Sorted-Sets中的每一个成员都会有一个分数(score)与之关联,Redis正是通过分数来为集合中的成员进行从小到大的排序。然而需要额外指出的是,尽管Sorted-Sets中的成员必须是唯一的,但是分数(score)却是可以重复的。
  在Sorted-Set中添加、删除或更新一个成员都是非常快速的操作,其时间复杂度为集合中成员数量的对数。由于Sorted-Sets中的成员在集合中的位置是有序的,因此,即便是访问位于集合中部的成员也仍然是非常高效的。事实上,Redis所具有的这一特征在很多其它类型的数据库中是很难实现的,换句话说,在该点上要想达到和Redis同样的高效,在其它数据库中进行建模是非常困难的。
  命令示例:
  1. ZADD/ZCARD/ZCOUNT/ZREM/ZINCRBY/ZSCORE/ZRANGE/ZRANK:
  #在Shell的命令行下启动Redis客户端工具。
  /> redis-cli
  #添加一个分数为1的成员。
  redis 127.0.0.1:6379> zadd myzset 1 "one"
  (integer) 1
  #添加两个分数分别是2和3的两个成员。
  redis 127.0.0.1:6379> zadd myzset 2 "two" 3"three"
  (integer) 2
  #0表示第一个成员,-1表示最后一个成员。WITHSCORES选项表示返回的结果中包含每个成员及其分数,否则只返回成员。
  redis 127.0.0.1:6379> zrange myzset 0 -1 WITHSCORES
  1) "one"
  2) "1"
  3) "two"
  4) "2"
  5) "three"
  6) "3"
  #获取成员one在Sorted-Set中的位置索引值。0表示第一个位置。
  redis 127.0.0.1:6379> zrank myzset one
  (integer) 0
  #成员four并不存在,因此返回nil。
  redis 127.0.0.1:6379> zrank myzset four
  (nil)
  #获取myzset键中成员的数量。
  redis 127.0.0.1:6379> zcard myzset
  (integer) 3
  #返回与myzset关联的Sorted-Set中,分数满足表达式1  zrem myzset one two
  (integer) 2
  #查看是否删除成功。
  redis 127.0.0.1:6379> zcard myzset
  (integer) 1
  #获取成员three的分数。返回值是字符串形式。
  redis 127.0.0.1:6379> zscore myzset three
  "3"
  #由于成员two已经被删除,所以该命令返回nil。
  redis 127.0.0.1:6379> zscore myzset two
  (nil)
  #将成员one的分数增加2,并返回该成员更新后的分数。
  redis 127.0.0.1:6379> zincrby myzset 2 one
  "3"
  #将成员one的分数增加-1,并返回该成员更新后的分数。
  redis 127.0.0.1:6379> zincrby myzset -1 one
  "2"
  #查看在更新了成员的分数后是否正确。
  redis 127.0.0.1:6379> zrange myzset 0 -1 WITHSCORES
  1) "one"
  2) "2"
  3) "two"
  4) "2"
  5) "three"
  6) "3"
  2. ZRANGEBYSCORE/ZREMRANGEBYRANK/ZREMRANGEBYSCORE
  redis 127.0.0.1:6379> del myzset
  (integer) 1
  redis 127.0.0.1:6379> zadd myzset 1 one 2 two 3 three 4 four
  (integer) 4
  #获取分数满足表达式1  zrangebyscore myzset -inf +inf limit 2 3
  1) "three"
  2) "four"
  #删除分数满足表达式1  zrange myzset 0 -1
  1) "three"
  2) "four"
  #删除位置索引满足表达式0  zcard myzset
  (integer) 0
  3. ZREVRANGE/ZREVRANGEBYSCORE/ZREVRANK:
  #为后面的示例准备测试数据。
  redis 127.0.0.1:6379> del myzset
  (integer) 0
  redis 127.0.0.1:6379> zadd myzset 1 one 2 two 3 three 4 four
  (integer) 4
  #以位置索引从高到低的方式获取并返回此区间内的成员。
  redis 127.0.0.1:6379> zrevrange myzset 0 -1 WITHSCORES
  1) "four"
  2) "4"
  3) "three"
  4) "3"
  5) "two"
  6) "2"
  7) "one"
  8) "1"
  #由于是从高到低的排序,所以位置等于0的是four,1是three,并以此类推。
  redis 127.0.0.1:6379> zrevrange myzset 1 3
  1) "three"
  2) "two"
  3) "one"
  #由于是从高到低的排序,所以one的位置是3。
  redis 127.0.0.1:6379> zrevrank myzset one
  (integer) 3
  #由于是从高到低的排序,所以four的位置是0。
  redis 127.0.0.1:6379> zrevrank myzset four
  (integer) 0
  #获取分数满足表达式3 >= score >=0的成员,并以相反的顺序输出,即从高到底的顺序。
  redis 127.0.0.1:6379> zrevrangebyscore myzset 3 0
  1) "three"
  2) "two"
  3) "one"
  #该命令支持limit选项,其含义等同于zrangebyscore中的该选项,只是在计算位置时按照相反的顺序计算和获取。
  redis 127.0.0.1:6379> zrevrangebyscore myzset 4 0 limit 1 2
  1) "three"
  2) "two"
  应用范围:
  1). 可以用于一个大型在线游戏的积分排行榜。每当玩家的分数发生变化时,可以执行ZADD命令更新玩家的分数,此后再通过ZRANGE命令获取积分TOP TEN的用户信息。当然我们也可以利用ZRANK命令通过username来获取玩家的排行信息。最后我们将组合使用ZRANGE和ZRANK命令快速的获取和某个玩家积分相近的其他用户的信息。
  2). Sorted-Sets类型还可用于构建索引数据。



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-631891-1-1.html 上篇帖子: redis服务安装、配置、使用 下篇帖子: centos环境下redis扩展安装
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表