redis使用之操作(针对开发)

redis在应用开发中经常被用来缓存

一、MAC下redis安装、启动与连接(本地)

reids安装网上有很多,有自己make源码的,有brew安装的,等等,这里不详细介绍,只是简单的说明下

  • 最简单直接的安装方式:brew install redis,默认安装在/usr/local/bin下,具体安装在哪里,可以看下 which redis-server
  • 启动:terminal下运行redis-server,不报错就行
  • 客户端连接:terminal下运行redis-cli,在没有任何配置redis config的情况下会进显示:127.0.0.1:6379>,就是显示redis服务的ip和端口(redis默认端口是6379),再测试下:输入 ping ,如果返回 pong 说明已经连接成功

接下来介绍如何使用

reids数据结构分为:字符串,哈希,列表,集合和有序集合,下面分别介绍不同数据结构的操作方法(#xxx作为注释看待,并非redis语法),redis操作一般0表示不成功,1表示成功,每个例子默认数据库是空的没有设置key;命令不分大小写

首先介绍各数据结构都会用到的命令(key)

  • del key [keyn]:删除某个key,支持多个key删除
  # 设置key
  set name 'randy' # 返回OK,说明设置成功
  # 再看下name的值
  get name # 返回"randy"
  # 删除key命令
  del name # 返回(integer) 1
  # 验证下是否删除成功
  get name # 返回的是(nil),说明name对应的值已经不存在了,删除成功
  • exists key:查看redis数据库是否存在key
# 在未设置name的情况下,看是否存在name
exists name  # 返回(integer) 0,说明不存在
# 设置name
set name 'randy' # 返回OK,说明设置成功
# 再看下是否存在name
  • rename oldkey newkey:重命名key
# 设置name
set name 'randy' # 返回OK,说明设置成功
# 运行重命名命令
rename name nick # 返回OK,说明操作成功
# get oldkey 命令查看下
get name # 返回的是(nil),说明name对应的值已经不存在了
# get newkey
get nick # 返回"randy"
# 重命名成功
  • renamenx oldkey newkey:重命名oldkey为newkey,但前提是newkey不存在
# 设置name,nick
set name 'randy' # 返回OK,说明设置成功
set nick 'jack' # 返回OK,说明设置成功
# 运行重命名命令
renamenx name nick # 返回(integer) 0,说明操作失败
renamenx name nickname # 返回(integer) 1,说明操作成功
  • randomkey:在已有的key中随机返回一个key(多次运行会发现返回不同的key,不是key对应的值哦)
randomkey
  • type key:返回数据类型
# 设置name为string,设置user:randy为hash类型(语法后面会介绍)
set name 'randy'
hset user:randy name "randy"
# 查看类型
type name # 返回string
type user:randy # 返回hash
type userxxx # 返回none:没有对应的key就返回none
  • keys pattern:查找符合pattern的key
# 先造数据,设置一些key
set name 'randy'
hset user:randy name "randy"
set nick 'jack'
# 查找符合pattern的key
keys * # 返回所有定义的key,当数据库数据量很大的数据不要只想
keys n* # 返回 name 和 nick
  • move key dbName:将key从当前数据库移动到dbName数据库
# 先造数据,设置name
set name 'randy'
# 移动
move name 1 # 返回(integer) 1,移动成功
# 验证
get name # 返回(nil)
# 进入1数据库,terminal显示看出来:127.0.0.1:6379[1]>,后边方括号表示数据库名称,默认数据库为0
select 1 
get name # 返回 "randy"
  • expire(pexpire) key seconds:设置指定key在seconds秒后过期;pexpire表示以毫秒计算
# 先建个key
set name 'randy'
# 设置过期
expire name 3 # 返回(integer) 1,操作成功
# 3秒后查看 name的值
get name # 返回(nil)
  • expireat(pexpireat) key timestamp:设置指定key的过期时间,timestamp为unix时间戳(命令可以拆成 expire at,即在xxx时间过期);pexpireat表示时间戳为毫秒数
# 先建个key
set name 'randy'
# 设置过期
expireat name timestamp # 返回(integer) 1,操作成功(timestamp自己去找个)
# 时间戳以后查看 name的值
get name # 返回(nil)
  • ttl(pttl) key:查看key的还有多少时间过期,ttl以秒为单位,pttl以毫秒为单位
# 先建个key
set name 'randy'
# 设置过期
expire name 30 # 返回(integer) 1,操作成功
# 过2秒查看
ttl name # (integer) 28
# ttl 一个不存在的key
ttl nick # 返回-2
# 重新设置name
set name 'randy'
# ttl 一个没有过期时间的key
ttl name # 返回-1
  • persist key:移除key的过期信息
set name 'randy'
# 设置过期
expire name 30 # 返回(integer) 1,操作成功
# 过2秒查看
ttl name # (integer) 28
# 移除过期时间
persist name # 返回(integer) 1,操作成功
ttl name # 返回-1

string

string类型是最简单的key-value存储

  • set key value:设置键值对,上面已经用的比较多
set name "randy"
  • get key:获取key对应的value
# 先set一下
set name "randy"
get name # 返回randy
# get不存在的key
get nick # 返回(nil)
  • getrange key start end:获取key对应string的start到end的子串(包括start和end)
# 先set一下
set name "randy"
getrange name 1 3 # 返回"and"
getrange name 1 10 # 返回"andy"
getrange name 8 10 # 返回""
  • getset key newvalue:先获取key对应的value,再将key对应的value设置为newvalue
# 先set一下
set name "randy"
getset name 'jack' # 返回"randy"
get name # 返回 "jack"
  • mget key1 [keyn]:同时获取key1,keyn的值
# 先set一下
set name "randy"
set nick "jack"
mget name nick # 返回randy jack
  • setex(psetex) key seconds value:设置key的值为value,并在seconds秒后过期,psetex的单位为毫秒
# 先set一下
set name "randy"
setex name 1000 "tracy" # 返回OK
get name # 返回"tracy"
  • setnx key value:设置key的值为value,前提是key不存在
setnx name 'randy' # 返回(integer) 1
get name # 返回randy
setnx name 'randy' # 返回(integer) 0,操作失败
  • setrange key offset value:用 value 参数覆写给定 key 所储存的字符串值,从偏移量 offset 开始
setrange name 3 'jack'
get name # 返回"\x00\x00\x00ii"
del name
set name 'randy'
setrange name 5 " good"
get name # 返回"randy good"
  • strlen key:返回key对应value的字符串长度
# 先set一下
set name "randy"
strlen name # 返回(integer) 5
strlen na # 未设置的key,返回(integer) 0
  • mset key value [key value …]:同时设置一个或多个 key-value 对
mset name "randy" nick "jack"
mget name jack # 返回"randy" "jack"
  • msetnx key value [key value …] 同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在
msetnx name 'randy' nick 'jack' # 返回(integer) 1
keys * # 返回name nick
msetnx name 'randy' nick1 'jack' # 返回(integer) 0
keys * # 返回name nick,第二个msetnx未成功
  • incr key:将key对应的value加1,并回存到key中,这里要求value是数字(value必须是整数)
set name 1
get name # 返回1
incr name
get name # 返回2 
set name "randy"
incr name # 提示:(error) ERR value is not an integer or out of range
  • incrby key increment:与incr相似,只是将加1改成加increment(increment可为负数)
set name 1
incrby name 5
get name # 返回6
  • incrbyfloat key increment:增加increment(increment可为浮点数)
set name 1
incrbyfloat name 1.5
get name # 返回2.5
  • decr key:与incr key 相反(value必须是integer)
set name 3
decr name 
get name # 返回2
  • decrby key decrement:与incrby key increment相反(value必须是integer)
set name 3
decrby name 2
get name # 返回1
  • APPEND key value:在key对应的值后追加value字符串
set name 'randy'
append name ' good'
get name # 返回 "randy good"
  • setbit key offset value:将key对应的offset位置设置为value(value只能为0和1); getbit key offset:获取key对应的offset位置的value;bit操作速度非常快,适合设置标志位
setbit name 1 1
getbit name 1 # 返回1
getbit name 0 # 返回0
  • scan cursor [count n]:迭代keym,n默认为10,scan处理还有些注意点,可以参考文档
mset name1 1 name2 2 name3 3 name4 4 name5 5 name6 6 name7 7 name8 8 name9 9 name10 10 name11 11 name12 12 name13 13 name14 14 name15 15 name16 16 name17 17 name18 18
scan 0 count 2 # 返回1) "4" 2) 1) "name5" 2) "name7" ,其中4表示游标,下一次scan的时候要用返回的游标,而后面的count表示返回元素个数,但并非完全一致(具体算法有待研究)
scan 4 count 2 # 一致迭代下去,当返回的cursor为0时表示迭代结束

hash

hash的数据结构是一个key可以存多个属性,非常实用存储对象,比如用户信息什么的

  • hset key field value:设置key的filed域值;hget key field:获取key的field属性值
hset user:randy name "randy"
hget user:randy name # 返回"randy"
  • hmset key field1 value1 [field2 value2]:一次性设置多个属性
hmset user:randy name "randy" age 10
hget user:randy name # 返回"randy"
hget user:randy age # 返回10
  • hmget key field1 [filed2]:获取key的field属性值,一次性获取多个
hmset user:randy name "randy" age 10
hmget user:randy name age # 返回 "randy" 10
  • hgetall key:获取在哈希表中指定 key 的所有字段和值
hmset user:randy name "randy" age 10
hgetall user:randy # 返回 "name" "randy" "age" "10"
  • hsetnx key field value 只有在字段 field 不存在时,设置哈希表字段的值
hsetnx user:randy name "randy"
hgetall user:randy # 返回 "name" "randy"
hsetnx user:randy name "randys" # 返回(integer) 0
hget user:randy name # 返回 "randy",重新设置没有成功
  • hdel key field1 [filed2]:删除key的属性,可一次删除多个
hmset user:randy name "randy" age 10 nick 'jack'
hkeys user:randy # 返回 name age nick
hdel user:randy age nick
hkeys user:randy # 返回 name
  • hexists key field:判断key是否存在field属性
hmset user:randy name "randy" age 10 nick 'jack'
hexists user:randy age # 返回(integer) 1,存在
hexists user:randy age1 # 返回(integer) 0,不存在
  • hkeys key:获取key对象中的所有key
hmset user:randy name "randy" age 10 nick 'jack'
hkeys user:randy # 返回 name age nick
  • hvals key:获取哈希表中所有值
hmset user:randy name "randy" age 10 nick 'jack'
hvals user:randy # 返回 "randy" "10" "jack"
  • hlen key 获取哈希表中字段的数量
hmset user:randy name "randy" age 10 nick 'jack'
hlen user:randy # 返回3
  • hincrby key field increment:为哈希表 key 中的指定字段的整数值加上增量 increment
hmset user:randy name "randy" age 10 nick 'jack'
hincrby user:randy age 3
hget user:randy age # 返回"13"
  • hincrbyfloat key field increment 为哈希表 key 中的指定字段的浮点数值加上增量 increment
hmset user:randy name "randy" age 10 nick 'jack'
hincrbyfloat user:randy age 3.5
hget user:randy age # 返回"13.5"
  • hscan key cursor [match pattern] [count n]:遍历key的属性,如果有pattern,则遍历符合pattern的属性,游标用法与scan相似

list

list的应用场景非常多,比如微博的关注列表,粉丝列表等都可以用Redis的list结构来实现

  • lpush key value1 [value2] 将一个或多个值插入到列表头部
lpush randy:fans "jack" "randy" "tracy"
llen randy:fans # 返回(integer) 3,成功插入3条记录
lrange randy:fans 0 4 # 返回 "tracy" "randy" "jack",跟插入顺序是反的
  • rpush key value1 [value2] 在列表中尾部添加一个或多个值
rpush randy:fans "nancy" "bryant"
lrange randy:fans 0 1 # 返回 "nancy" "bryant",跟插入顺序一致
  • lrange key start stop 获取列表指定范围内的元素
rpush randy:fans "nancy" "bryant"
lrange randy:fans 0 1 # 返回 "nancy" "bryant"
lrange randy:fans 0 4 # 返回 "nancy" "bryant"
lrange randy:fans 2 4 # 返回 (empty list or set)
  • lindex key index 通过索引获取列表中的元素
lpush randy:fans "jack" "randy" "tracy"
lindex randy:fans 2 # 返回 "jack"
  • lpushx key value 将一个值插入到已存在的列表头部,前提是key存在
lpushx randy:fans "jack1" # 返回(integer) 0
lpush randy:fans "jack"
lpush randy:fans "jack1"
lrange randy:fans 0 1 # 返回 "jack1" "jack"
  • rpushx key value 将一个值插入到已存在的列表尾部,前提是key存在
rpushx randy:fans "jack1" # 返回(integer) 0
lpush randy:fans "jack"
rpush randy:fans "jack1"
lrange randy:fans 0 1 # 返回 "jack" "jack1"
  • llen key 获取列表长度
lpush randy:fans "jack" "randy" "tracy"
llen randy:fans # 返回3
  • lpop key 移出并获取列表头部的第一个元素
lpush randy:fans "jack" "randy" "tracy"
lpop randy:fans # 返回"jack"
llen randy:fans # 返回2
  • RPOP key 移除并获取列表最后一个元素
lpush randy:fans "jack" "randy" "tracy"
rpop randy:fans # 返回"tracy"
llen randy:fans # 返回2
  • lset key index value 通过索引设置列表元素的值
lpush randy:fans "jack" "randy" "tracy"
lset randy:fans 0 "jack1"
lpop randy:fans # 返回 "jack1"
  • lrem key count value 从头部开始移除count个为value值的元素
lpush randy:fans "jack" "randy" "tracy" "jack" "randy" "tracy" "jack" "randy" "tracy"
lrem randy:fans 2 "jack" 
lrange randy:fans 0 10 # 返回 "randy" "tracy" "randy" "tracy" "jack" "randy" "tracy"
  • ltrim key start stop:remove不在指定区间之内的元素
lpush randy:fans "jack" "randy" "tracy" "jack" "randy" "tracy" "jack" "randy" "tracy"
ltrim randy:fanss 0 3
lrange randy:fans 0 10 # 返回"jack" "randy" "tracy" "jack"
  • linsert key before|after existedValue value:在从左开始第一个existedValue前或后插入value
lpush randy:fans "jack" "randy" "tracy" "jack" "randy"
linsert randy:fans before "randy" "meisi"
lrange randy:fans 0 10 # 返回"jack" "meisi" "randy" "tracy" "jack" "randy"
  • blpop key1 [key2] timeout 移出并获取列表头部的第一个元素,支持多个列表, 如果列表没有元素会阻塞列表直到等待超时或发现可pop元素,当第一个列表数据没有时,pop第二个列表,timeout单位为秒,0表示一直等待,可以blpop一个空列表来测试timeout参数
lpush randy:fans "jack" "randy" "tracy" "jack" "randy"
lpush randy:fanss "jack" "randy" "tracy" "jack" "randy"
blpop randy:fans randy:fanss 10
  • brpop key1 [key2] timeout 与blpop相反移出并获取列表尾部的第一个元素
  • rpoplpush source destination:从source尾部pop一个元素并push到destination头部
lpush randy:fans "jack" "randy" "tracy" "jack" "randy"
rpoplpush randy:fans randy:fanss
lrange randy:fans 0 10 #返回 "jack" "randy" "tracy" "jack"
lrange randy:fanss 0 1 #返回 "randy"
  • brpoplpush source destination timeout:与rpoplpush相似,但会有timeout,也就是说在timeout之内会阻塞source中有元素

set

set是string类型的无序集合,set成员是唯一的,不会有重复数据

  • sadd key member [member1]:往key集合中添加数据,支持多个
sadd userset:randy "randy" "jack" "randy" # 返回(integer) 2,说明只添加了2条数据
scard userset:randy # 返回(integer) 2,userset:randy集合只有2条数据
  • scard key:获取key的成员数量,例子在sadd中已经有了
  • sdiff key1 [key2]:获取key1与key2(可以多个,也可以没有)的差集
sadd userset:randy "randy" "jack" "xx"
sadd userset:randy1 "randy"
sadd userset:randy2 "xx"
sdiff userset:randy # 返回"randy" "jack" "xx"
sdiff userset:randy userset:randy1 userset:randy2 # 返回 "xx"
sdiff userset:randy userset:randy1 userset:randy3 # 返回 "jack" "xx"
  • sdiffstore destination key1 [key2] :返回key1与key2(可多个)的差集并存储在 destination 中
sadd userset:randy "randy" "jack" "xx"
sadd userset:randy1 "randy"
sdiffstore userset:randy2 userset:randy userset:randy1
scard userset:randy2 # 返回 (integer) 2
  • sinter key1 [key2]:获取key1与key2(多个的交集)
sadd userset:randy "randy" "jack" "xx"
sadd userset:randy1 "randy"
sadd userset:randy2 "xx"
sinter userset:randy userset:randy1 # 返回"randy"
sinter userset:randy userset:randy1 userset:randy2 # 返回(empty list or set)
  • sinterstore destination key1 [key2]:返回key1与key2(可多个)的交集并存储在 destination 中
sadd userset:randy "randy" "jack" "xx"
sadd userset:randy1 "randy"
sinter userset:randy2 userset:randy userset:randy1
scard userset:randy2 # 返回 (integer) 1
  • sismember key member:判断member是否key的一个元素
sadd userset:randy "randy" "jack" "xx"
sismember userset:randy "jack" # 返回(integer) 1
sismember userset:randy "jack1" # 返回(integer) 0
  • SMEMBERS key 返回集合中的所有元素
sadd userset:randy "randy" "jack" "xx"
smembers userset:randy # "jack" "randy" "xx"
  • smove source destination member:将source中的member元素移动到destination
sadd userset:randy "randy" "jack" "xx"
smove userset:randy userset:randy1 "jack"
smember userset:randy # 返回 "randy" "xx"
smember userset:randy1 # 返回 "jack"
  • spop key:从key集合中随机pop一个元素
sadd userset:randy "randy" "jack" "xx" "randy1" "jack1" "xx1"
spop userset:randy # 返回 "xx"(每次pop是随机的元素)
spop userset:randy # 返回 "randy1"
  • srandmember key [count]:随机获取集合key中的count个元素
sadd userset:randy "randy" "jack" "xx" "randy1" "jack1" "xx1"
srandmember userset:randy # "jack1"
srandmember userset:randy # "xx"
srandmember userset:randy 2 # "jack1" "xx"
srandmember userset:randy 2 # "jack1" "xx1"
  • srem key member1 [member2] :移除集合key中指定元素
sadd userset:randy "randy" "jack" "xx" "randy1" "jack1" "xx1"
srem userset:randy "randy" "jack"
smembers userset:randy # 返回 "xx" "randy1" "jack1" "xx1"
  • sunion key1 [key2] :返回所集合的并集(支持多个)
sadd userset:randy "randy" "jack"
sadd userset:randy1 "randy" "randy1"
sadd userset:randy2 "randy1" "xx"
sunion userset:randy userset:randy1 userset:randy2 # 返回 "xx" "jack" "randy1" "randy"
  • sunionstore destination key1 [key2] :将所集合的并集并存储在 destination 集合中
  • sscan key [match pattern] [count count]:迭代集合键中的元素,类似scan
sadd userset:randy "randy" "jack" "xx" "randy1" "jack1" "xx1"
sscan userset:randy 0 match j* # 返回1) "0" 2) 1) "jack" 2) "jack1"

sorted set

有序列表

  • zadd key score1 member1 [score2 member2]: 向有序集合添加一个或多个成员,或者更新已存在成员的score
zadd rank 1 "randy" 2 "tracy" 5 "jack" 3 "oo" # 新增4个元素
zrange rank 0 -1 withscores # 返回1) "randy" 2) "1" 3) "tracy" 4) "2" 5) "oo" 6) "3" 7) "jack" 8) "5"
zadd rank 4 'oo' # "oo"的score设置为4
zrange rank 0 -1 withscores # 返回1) "randy" 2) "1" 3) "tracy" 4) "2" 5) "oo" 6) "4" 7) "jack" 8) "5"
  • zrange key start stop [withscores]:返回指定区间的值
zadd rank 1 "randy" 2 "tracy" 5 "jack" 3 "oo" # 新增4个元素
zrange rank 0 -1 withscores # 返回1) "randy" 2) "1" 3) "tracy" 4) "2" 5) "oo" 6) "3" 7) "jack" 8) "5"
zrange rank 1 2 # 返回 "tracy" "oo"
zrange rank 1 2 withscores # 返回 "tracy" "2" "oo" "3"
  • zrevrange key start stop [WITHSCORES]:返回指定区间的值,分数从高到低,用法似zrange
# 设置测试数据
zadd rank4 1 'a' 2 'b' 3 'c' 6 'd' 4 'e'
zrevrange rank4 0 -1 # 返回 "d" "e" "c" "b" "a"
  • zrank key member 返回指定成员的排名索引(分值从小到大)
# 设置测试数据
zadd rank4 1 'a' 2 'b' 3 'c' 6 'd' 4 'e'
zrank rank4 '' #c 返回 3
  • zrevrank key member 返回指定成员的排名索引(分值从大到小),用法似zrank
  • zcard key:获取集合的成员数
zadd rank 1 "randy" 2 "tracy" 5 "jack" 3 "oo" # 新增4个元素
zcard rank # 返回 (integer) 4
  • zcount key min max:计算指定区间分数的成员数
zadd rank 1 "randy" 2 "tracy" 5 "jack" 3 "oo" # 新增4个元素
count rank 1 3 # 返回 (integer) 3
  • zincrby key increment member:对指定成员的分数加上增量 increment
zadd rank2 1 'rd' 2 'ty'
zincrby rank2 2 'ty'
zrange rank2 0 -1 withscores # 返回 "rd" "1" "ty" "4"
  • zscore key member:返回成员的分数值
```redis
zadd rank2 1 'rd' 2 'ty'
zscore rank2 'ty' # 返回 "2"
  • zinterstore destination numkeys key [key …] [WEIGHTS weight [weight …]] [AGGREGATE SUM|MIN|MAX]:numkeys为key的个数,计算给定的一个或多个有序集的交集并将结果集存储在新的有序集合key 中,weights weight分别对应key的score的倍数,aggregate:sum|min|max表示使用哪种计算方式,默认为sum
  • zunionstore destination numkeys key [key …] [WEIGHTS weight [weight …]] [AGGREGATE SUM|MIN|MAX]:用法似zinterstore,只是结果为并集
# 先造数据
zadd rank1 1 "r" 2 "a" 3 "b" "4" "f" 3 "d"
zadd rank2 1 "r" 2 "g" 3 "b" "4" "f" 3 "h"
zinterstore rank3 2 rank1 rank2
zrange rank3 0 -1 withscores # 返回 "r" "2" "b" "6" "f" "8"
# 使用weights参数
zinterstore rank3 2 rank1 rank2 weights 1 2
zrange rank3 0 -1 withscores # 返回 "r" "3" "b" "9" "f" "12"
# 使用aggregate
zinterstore rank3 2 rank1 rank2 weights 1 2 aggregate max
zrange rank3 0 -1 withscores # 返回 "r" "2" "b" "6" "f" "8"
  • zrem key member [member …]:移除有序集合中的一个或多个成员
zadd rank4 1 'a' 2 'b' # 设置测试数据
zrem rank4 'b' # 移除操作
zrange rank4 0 -1 # 返回 "a"
  • zrangebyscore key min max [WITHSCORES] [limit offset count]:通过分数返回有序集合指定区间内的成员
# 设置测试数据
zadd rank4 1 'a' 2 'b' 3 'c' 6 'd' 4 'e'
zrangebyscore rank4 1 4 # 返回 "a" "c" "e" ,如果带上withscores,会连score一起返回
zrangebyscore rank4 1 4 withscores limit 0 2 # "a" "1" "c" "3"
  • zrevrangebyscore key max min [WITHSCORES]:返回指定分数区间内的成员,分数从高到低排序,用法似zrangebyscore
  • zlexcount key min max:在有序集合中计算指定字典区间内成员数量,min max:[xxx;
zadd rank4 1 'a' 2 'b'
zadd rank4 3 'c' 6 'd' 4 'e'
zlexcount rank4 [b [e # 返回(integer) 3
  • zrangebylex key min max [limit offset count]:通过字典区间返回有序集合的成员 min max:[xxx
zadd rank4 1 'a' 2 'b'
zadd rank4 3 'c' 6 'd' 4 'e'
zrangebylex rank4 [b [e # 返回"b" "c" "e" "d"
  • zremrangebylex key min max:用法类似zrangebylex,只是把筛选出来的结果从key的集合中移除
  • zremrangebyscore key min max:移除给定的分数区间的所有成员
  • zremrangebyrank key start stop:移除给定的排名区间的所有成员
# 设置测试数据
zadd rank4 1 'a' 2 'b' 3 'c' 6 'd' 4 'e'
zremrangebyrank rank4 1 2
zrange rank4 0 -1 # 返回 "a" "e" "d"
  • zscan key cursor [MATCH pattern] [COUNT count]:用法似sscan,迭代获取key集合的元素

HyperLogLog

2.8.9版本添加的数据结构;使用场景:适合用来做统计,比如日pv等,这个数据结构不存储实际的数据,所以非常省内存
* pfadd key element [element…]:添加元素,但不会添加重复元素

pfadd log "jack" "elice" "jack"
pfcount log # 返回 2
  • pfcount key:计算key的个数,上边例子已存在
  • pfmerge destionation key1 key2
pfadd log3 "a" "b"
pfadd log4 "c" "d" "b"
pfmerge log6 log3 log4
pfcount log6 # 返回 4,将重复的去掉了

发布订阅

  • subcribe channel [channel1…]:订阅一个或多个channel
# 新开一个redis客户端
subcribe redischat redischat1 # 返回 "subscribe" "redischat"  (integer) 1 "subscribe" "redischat1"  (integer) 2 
  • publish channel message:在channel上发布消息
# 新开一个redis客户端1
subcribe redischat redischat1
# 新开一个redis客户端2
publish redischat1 "hello" # 在客户端1显示 "message" "redischat1" "hello",客户端1接收到订阅的channel的由客户端2pulish的消息
  • psubscribe pattern [pattern …]:订阅一个或多个符合给定模式的频道,用法类似subcribe
psubscribe sss* ddd*
  • punsubscribe [pattern [pattern …]]:退订所有给定模式的channel
  • unsubscribe channel [channel …]:指退订给定的channel
  • pubsub channels [pattern/channel]:返回活跃channel(有订阅的客户端的channel)的列表

事务

redis事务是比较弱的,加上watch才能对事务进行保证,比如在事务里,获取name的值,修改name并置回去,get 和 set中间name有改动,是无法感知的,只有watch了name才会有效;
* redis事务以multi开始,用exec执行
* 验证watch

set age 1
watch age
set age 2
multi
set age 3
exec
get age # 返回 2
unwatch
multi 
set age 3
exec
get age # 返回3

参考资料

redis中文站教程

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值