Redis常用命令
全局命令 time
一个包含两个字符串的列表: 第一个字符串是当前时间(以 UNIX 时间戳格式表示),而第二个字符串是当前这一秒钟已经逝去的微秒数。
1 2 3 127.0.0.1:6379> time 1) "1561539827" 2) "938527"
dbsize
返回当前数据库的 key 的数量。
1 2 3 4 5 6 127.0.0.1:6379> dbsize (integer) 3 127.0.0.1:6379> set age 26 OK 127.0.0.1:6379> dbsize (integer) 4
exists
检查给定key是否存在,若存在返回1,否则返回0
1 2 3 4 5 6 27.0.0.1:6379> exists yhq (integer) 0 127.0.0.1:6379> set yhq 1 OK 127.0.0.1:6379> exists yhq (integer) 1
type key
返回键存储值的类型 : none(键不存在) string(字符串或者HyperLogLog) hash(散列)list(列表)set(无序集合)zset(有序集合)
1 2 3 4 5 6 7 8 127.0.0.1:6379> keys * 1) "hkey" 2) "name" 127.0.0.1:6379> type name string 127.0.0.1:6379> type hkey hash 127.0.0.1:6379>
select
切换到指定的数据库,数据库索引号 index
用数字值指定,以 0
作为起始索引值。默认使用 0
号数据库。默认16个数据库,数据库之间互不相通。
1 2 3 4 5 6 7 8 9 10 127.0.0.1:6379> dbsize (integer) 4 127.0.0.1:6379> select 1 OK 127.0.0.1:6379[1]> dbsize (integer) 0 127.0.0.1:6379[1]> select 0 OK 127.0.0.1:6379> dbsize (integer) 4
MOVE key db
将当前数据库的 key
移动到给定的数据库 db
当中。如果当前数据库(源数据库)和给定数据库(目标数据库)有相同名字的给定 key
,或者 key
不存在于当前数据库,那么 MOVE
没有任何效果。移动成功返回 1
,失败则返回 0
。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 127.0.0.1:6379> select 0 OK 127.0.0.1:6379> set yhq qhh OK 127.0.0.1:6379> move yhq 1 (integer) 1 127.0.0.1:6379> exists yhq (integer) 0 127.0.0.1:6379> select 1 OK 127.0.0.1:6379[1]> exists yhq (integer) 1 127.0.0.1:6379[1]> exists qhh (integer) 0 127.0.0.1:6379[1]> move qhh 0 (integer) 0
flushdb
清空当前数据库
1 2 3 4 5 6 127.0.0.1:6379> dbsize (integer) 1 127.0.0.1:6379> flushdb OK 127.0.0.1:6379> dbsize (integer) 0
flushall
清空所有库
1 2 3 4 5 6 7 8 9 10 11 12 13 14 127.0.0.1:6379> set yhq 1 OK 127.0.0.1:6379> select 1 OK 127.0.0.1:6379[1]> set yhq 2 OK 127.0.0.1:6379[1]> flushall OK 127.0.0.1:6379[1]> keys * (empty list or set) 127.0.0.1:6379[1]> select 0 OK 127.0.0.1:6379> keys * (empty list or set)
注: 如果不小心运行了flushall, 立即 shutdown nosave ,关闭服务器
然后 手工编辑aof文件, 去掉文件中的 “flushall ”相关行, 然后开启服务器,就可以导入回原来数据.
如果,flushall之后,系统恰好bgrewriteaof了,那么aof就清空了,数据丢失.
SHUTDOWN [NOSAVE] [SAVE] 这个命令执行如下操作:
停止所有客户端.
如果配置了save 策略 则执行一个阻塞的save命令.
如果开启了AOF,则刷新aof文件
关闭redis服务进程(redis-server).
如果配置了持久化策略,那么这个命令将能够保证在关闭redis服务进程的时候数据不会丢失. 如果仅仅在客户端执行SAVE 命令,然后 执行QUIT 命令,那么数据的完整性将不会被保证,因为其他客户端可能在执行这两个命令的期间修改数据库的数据。
注意 : 一个没有配置持久化策略的redis实例 (没有aof配置, 没有 “save” 命令) 将不会 在执行SHUTDOWN命令的时候转存一个rdb文件, 通常情况下你不想让一个仅用于缓存的rendis实例宕掉
SAVE 和 NOSAVE 修饰符
通过指定一个可选的修饰符可以改变这个命令的表现形式 比如:
SHUTDOWN SAVE能够在即使没有配置持久化的情况下强制数据库存储.
SHUTDOWN NOSAVE 能够在配置一个或者多个持久化策略的情况下阻止数据库存储. (你可以假想它为一个中断服务的 ABORT 命令).
返回值 : 当发生错误的时候返回状态码 . 当成功的时候不返回任何值,服务退出,链接关闭.
keys pattern
获得符合规则的键名列表
? 匹配一个字符
[]匹配括号间的任一字符,可以使用”-“符号表示一个范围,如a[b-d]可以匹配”ab”,”ac”,”ad”
\x匹配字符x,用于转义符号,例如?
*配任意个(包括0个)字符
1 2 3 > keys yh* 1) "yhqqhh" 2) "yhq"
[] 匹配括号间的任一字符,可以用 - 表示一个范围
\x 匹配字符x,用于转义符号,如匹配?就需要?
1 2 3 4 5 > keys qh? 1) "qhh" 2) "qh?" > keys qh\? 1) "qh?"
rename
成功返回ok,失败返回错误(当旧名称和新名称相同,或者旧名称不存在时,返回一个错误。当新名称已存在时,将覆盖旧值)
1 2 3 4 5 6 7 8 > get qhh "132" > rename qhh yhq OK > get yhq "132" > rename yh yhq (error) ERR no such key
renamenx
修改名称,和renamenx不同的是,修改成功返回1,如果新名称存在返回0
1 2 3 4 > renamenx yhq qhh (integer) 0 > renamenx yhq qhhyhq (integer) 1
randomkey
当数据库不为空时,随机返回key,当数据库为空时,返回nil
1 2 3 4 > randomkey "qhhyhq" > randomkey "qhh"
del 删除键,可以删除多个键,返回值是删除键的个数
返回当前数据库的 key 的数量。
字符串指令Stirng 简介 字符串类型: 实际上可以是字符串(包括 XML JSON) , 还有数字(整形 浮点数),二进制(图片 音频 视频),最大不能超过 512MB
使用场景 页面动态缓存 比如生成一个动态页面,首次可以将后台数据生成页面,并且存储到redis 字符串中。再次访问,不再进行数据库请求,直接从redis中读取该页面。特点是:首次访问比较慢,后续访问快速。
数据缓存 在前后分离式开发中,有些数据虽然存储在数据库,但是更改特别少。比如有个全国地区表。当前端发起请求后,后台如果每次都从关系型数据库读取,会影响网站整体性能。 我们可以在第一次访问的时候,将所有地区信息存储到redis字符串中,再次请求,直接从数据库中读取地区的json字符串,返回给前端
数据统计 redis整型可以用来记录网站访问量,某个文件的下载量。(自增自减)
时间内限制请求次数 比如已登录用户请求短信验证码,验证码在5分钟内有效的场景。 当用户首次请求了短信接口,将用户id存储到redis 已经发送短信的字符串中,并且设置过期时间为5分钟。当该用户再次请求短信接口,发现已经存在该用户发送短信记录,则不再发送短信。
分布式session 当我们用nginx做负载均衡的时候,如果我们每个从服务器上都各自存储自己的session,那么当切换了服务器后,session信息会由于不共享而会丢失,我们不得不考虑第三应用来存储session。通过我们用关系型数据库或者redis等非关系型数据库。关系型数据库存储和读取性能远远无法跟redis等非关系型数据库。
缓存,计数器,微博数,粉丝数,分布式锁
set指令
设置给定key的值,如果已存在覆盖,无视类型.set命令执行后,之前设置的过期时间失效.正常返回ok,如果加了nx或者xx,没有设置条件,返回nil
setxx
指定key存在,为key设置给定的值(成功1,失败0)
1 2 3 4 5 6 7 8 127.0.0.1:6379> set yhq qhh xx (nil) 127.0.0.1:6379> set yhq qhh OK 127.0.0.1:6379> set yhq qhh1 xx OK 127.0.0.1:6379> get yhq "qhh1"
setnx
指定的key不存在时,为key设置给定的值(成功1失败0)
1 2 3 4 > setnx yhq 123 (integer) 1 > setnx yhq 123 (integer) 0
ex
设置key的过期时间,单位秒
1 2 3 4 5 6 > set yhq qhh ex 10OK > get yhq "qhh" > get yhq (nil)
setex
设置key的过期时间,如果值存在覆盖
1 2 3 4 5 6 7 8 9 10 > setex yhq 20 qhh OK > get yhq "qhh" > setex yhq 10 qqqq OK > get yhq "qqqq" > get yhq (nil)
expire
设置key的过期时间,成功返回1,失败或者key不存在返回0
1 2 3 4 5 6 7 8 > expire yhq 10 (integer) 0 > set yhq qhhOK > expire yhq 5 (integer) 1 > get yhq (nil)
px
设置key的过期时间,单位毫秒
1 2 3 4 5 6 > set yhq qhh px 10000OK > get yhq "qhh" > get yhq (nil)
psetex
设置key的过期时间,单位毫秒
1 2 3 4 5 6 > psetex yhq 10000 qhh OK > get yhq "qhh" > get yhq (nil)
pexpire
设置key的过期时间,单位毫秒,成功返回1,失败或者不存在返回0
1 2 3 4 5 6 7 8 > pexpire yhq 10000 (integer) 0 > set yhq qhhOK > pexpire yhq 10000 (integer) 1 > get yhq (nil)
ttl
以秒为单位返回key的剩余获取时间,当key不存在时返回-2,当key没有过期时间时返回-1
1 2 3 4 5 6 7 8 9 10 > set yhq 123OK > ttl yhq (integer) -1 > expire yhq 10 (integer) 1 > ttl yhq (integer) 7 > ttl yhq (integer) -2
pttl
以毫秒为单位返回key的剩余获取时间,当key不存在时返回-2,当key没有过期时间时返回-1
1 2 3 4 5 6 7 8 > set yhq 123OK > pexpire yhq 10086 (integer) 1 > pttl yhq (integer) 3263 > pttl yhq (integer) -2
persist
移除给定key的过期时间,使其永不过期(成功移除返回1,key不存在或者没有过期时间返回0)
1 2 3 4 5 6 7 8 > expire qhhyhq 100 (integer) 1 > ttl qhhyhq (integer) 96 > persist qhhyhq (integer) 1 > ttl qhhyhq (integer) -1
dump
序列化给定key,返回被序列化的值,使用restore反序列化,key不存在返回nil
它带有64位的校验和,用于检测错误,restore在进行反序列化之前会先检查校验和
值的编码和RDB文件保持一致
RDB版本会被编码在序列化值中,如果因为redis版本不用造成RDB格式不兼容,nameredis会拒绝对这个值进行反序列化操作
1 2 3 4 5 6 > dump yhq (nil) > set yhq qhhOK > dump yhq "\x00\x03qhh\x06\x00\xa1\xc2\xcd\\\xe2\x96\xbd\xe3"
restore
反序列化给定的序列化值,并将它和给定的key关联,参数ttl以毫秒为单位为key设置生存时间,如果ttl为0,那么不设置生存时间(restore在执行反序列化之前会先对序列化值的RDB版和数据进行检查,如果RDB版本不完整的话,那么restore会拒绝进行反序列化,并返回一个错误)
1 2 3 4 > restore yhq-msg 0 "\x00\x03qhh\x06\x00\xa1\xc2\xcd\\\xe2\x96\xbd\xe3" OK > get yhq-msg "qhh"
strlen
获取key的长度(key不存在返回0,key不是字符串类型返回一个错误)
1 2 3 4 > strlen yhq (integer) 3 > strlen yhqqhh (integer) 0
setrange
用给定的字符串覆盖key,从offset开始
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 > setrange yhq 6 qhh (integer) 9 > get yhq "012345qhh" > get yhq "012345" > setrange yhq 7 qhh (integer) 10 > get yhq "012345\x00qhh" > set yhq 012345OK > get yhq "012345" > setrange yhq 2 yhqqhhhhh (integer) 11 > get yhq "01yhqqhhhhh"
getset
设置给定key的值,并返回key的旧值(没有旧值返回nil,当key存在但不是一个字符串类型时,返回一个错误)
1 2 3 4 5 6 > get yhq "6" > getset yhq 666 "6" > get yhq "666"
mset
设置一个或者多个键值对
1 2 > mset yhq 123 qhh 321 OK
mget
获取一个或者多个键值对(如果某个key不存在,返回nil)
1 2 3 4 > mget yhq qhh yhqqhh 1) "123" 2) "321" 3) (nil)
getrange
获取key的子字符串
1 2 3 4 5 6 > get yhq "123" > getrange yhq 0 1 "12" > getrange yhq 0 -1 "123"
msetnx
设置多个key,当所有key设置成功(不存在)返回1,如果失败(至少有一个存在)返回0
1 2 3 4 > msetnx q 132 y 123 (integer) 1 > msetnx q 132 yhq 123 (integer) 0
append
给定key追加val,如果不存在则set,返回val的长度
1 2 3 4 5 6 7 8 > append yhq 123 (integer) 3 > get yhq "123" > append yhq '-666' (integer) 7 > get yhq "123-666"
incr
给定key数值+1,如果key不存在,先set key 0再+1
1 2 3 4 > incr yhq (integer) 1 > incr qhh (error) ERR value is not an integer or out of range
decr
给定key数值-1,如果key不存在,先set key 0再-1
1 2 3 4 > decr yhq (integer) -1 > decr qhh (error) ERR value is not an integer or out of range
incrby / decrby
增加/减少给定值
1 2 3 4 5 6 > get yhq "-1" > incrby yhq 666 (integer) 665 > decrby yhq 555 (integer) 110
incrbyfloat
增加给定浮点值
1 2 3 4 > get yhq "110" > incrbyfloat yhq 6.6 "116.6"
位操作
一个字节由8个二进制位组成
bar 在ASCII码中分别是 01100010 , 01100001 , 01110010
1 2 3 4 > set yhq barOK > get yhq "bar"
getbit
获取字符串指定二进制位的值,索引从0开始,超出索引默认为0
1 2 3 4 > getbit yhq 6 (integer) 1 > getbit yhq 600 (integer) 0
将a转换为A A在ASCII码中是 65 0100 0001
setbit
设置字符串指定二进制位的值,返回值是该位置旧的值,索引从0开始,超出长度,自动将中间的二进制设置为0,不存在的键会将其前面的赋值0
1 2 3 4 > setbit yhq 10 0 (integer) 1 > get yhq "bAr"
01100010 , 01000001 , 01110010
bitcount
统计二进制位是1的个数,可以指定范围(bA 0-1),不存在返回0
1 2 3 4 bitcount yhq (integer) 9 > bitcount yhq 0 1 (integer) 5
Hash(哈希) 简介 Hash是一个String类型的field和value之间的映射表,即redis的hash数据类型key(hash表名称)对应的value实际的内部存储结构为一个HashMap,因此Hash特别适合存储对象。相当于把一个对象的每个属相存储为String类型,将整个对象存储在hash类型中会占用更少内存。
Redis 中每个 hash 可以存储 232 - 1 键值对(40多亿)。
使用场景 存储部分变更的数据,如用户信息等,存储表结构信息等。
hset
新建一个哈希表,设置成功返回1,如果已存在覆盖旧值,返回0(值可以为’’”)
1 2 3 4 27.0.0.1:6379> hset yhq name yhq (integer) 1 127.0.0.1:6379> hset yhq name qhh (integer) 0
hmset
新建一个哈希表,设置多个k-v,如果已存在会覆盖,成功返回ok(值可以为’’”)
1 2 127.0.0.1:6379> hmsetqhh name yhq age 24 sex 0 OK
hsetnx
当哈希表不存在时创建并设置且成功返回1,如果已存在无效,返回0
1 2 3 4 127.0.0.1:6379> hsetnx yhqqhh name qhh (integer) 1 127.0.0.1:6379> hsetnx yhqqhh name yhq (integer) 0
hstrlen
获取指定字段值的长度
1 2 3 4 5 6 7 8 127.0.0.1:6379> hmset myhash f1 HelloWorld f2 99 f3 -256 OK 127.0.0.1:6379> hstrlen myhash f1 (integer) 10 127.0.0.1:6379> hstrlen myhash f2 (integer) 2 127.0.0.1:6379> hstrlen myhash f3 (integer) 4
hget
获取哈希表字段的值,不存在返回nil
1 2 3 4 5 6 7 8 9 10 127.0.0.1:6379> hget yhq name "qhh" 127.0.0.1:6379> hget qhh name "yhq" 127.0.0.1:6379> hget qhh age "24" 127.0.0.1:6379> hget qhh sex "0" 127.0.0.1:6379> hget yhq id (nil)
hgetall
获取哈希表所有k-v,不存在返回空列表
1 2 3 4 5 6 7 8 9 127.0.0.1:6379> hgetall qhh 1) "name" 2) "yhq" 3) "age" 4) "24" 5) "sex" 6) "0" 127.0.0.1:6379> hgetall q (empty list or set)
hmget
获取一个或多个给定的值,不存在返回nil
1 2 3 4 127.0.0.1:6379> hmget qhh name age a 1) "yhq" 2) "24" 3) (nil)
hdel
删除一个或者多个哈希表字段,不存在忽略,返回删除字段的个数
1 2 3 4 5 6 7 8 9 10 127.0.0.1:6379> hgetall qhh 1) "name" 2) "1" 3) "age" 4) "2" 127.0.0.1:6379> hdel qhh age a (integer) 1 127.0.0.1:6379> hgetall qhh 1) "name" 2) "1"
hexists
查询哈希表字段是否存在,存在返回1,不存在返回0
1 2 3 4 5 6 7 8 9 127.0.0.1:6379> hgetall must 1) "name" 2) "" 3) "age" 4) "1" 127.0.0.1:6379> hexists must name (integer) 1 127.0.0.1:6379> hexists must na (integer) 0
hkeys
返回哈希表所有的k,key不存在返回空列表
1 2 3 4 5 127.0.0.1:6379> hkeys must 1) "name" 2) "age" 127.0.0.1:6379> hkeys must1 (empty list or set)
hvals
返回哈希表所有k值,key不存在返回空列表
1 2 3 4 5 127.0.0.1:6379> hvals must 1) "" 2) "1" 127.0.0.1:6379> hvals must1 (empty list or set)
hlen
返回哈希表字段数量,key不存在返回0
1 2 127.0.0.1:6379> hlen must (integer) 2
hincrby
对哈希表字段进行数值增删修改,字段串返回错误,如果不存在则执行创建操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 127.0.0.1:6379> hincrby yhq name 100 (integer) 100 127.0.0.1:6379> hgetall yhq 1) "name" 2) "100" 127.0.0.1:6379> hset yhq sex n (integer) 1 127.0.0.1:6379> hincrby yhq sex 100 (error) ERR hash value is not an integer 127.0.0.1:6379> hincrby yhq name -100 (integer) 0 127.0.0.1:6379> hgetall yhq 1) "name" 2) "0" 3) "sex" 4) "n"
hincrbyfloat
对哈希表字段进行数值增删浮点值修改,字段串返回错误,如果不存在则执行创建操作
1 2 3 4 5 6 7 8 9 127.0.0.1:6379> hincrbyfloat yhq size 1.1 "1.1" 127.0.0.1:6379> hincrbyfloat yhq name yhq (error) ERR value is not a valid float 127.0.0.1:6379> hincrbyfloat yhq size -11.11 "-10.01" 127.0.0.1:6379> hgetall yhq 1) "size" 2) "-10.01"
List(列表) 简介 Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)
一个列表最多可以包含 232 - 1 个元素 (4294967295, 每个列表超过40亿个元素)
使用场景 消息队列,时间轴
lpush
将一个或多个值插入列表头部,如果key是其他类型报错,成功返回列表数量,如果key不存在,先创建一个空列表
1 2 3 4 5 6 127.0.0.1:6379> set yhq 123 OK 127.0.0.1:6379> lpush yhq name age sex (error) WRONGTYPE Operation against a key holding the wrong kind of value 127.0.0.1:6379> lpush qhh name age sex (integer) 3
lrange
获取指定范围的值,0开始-1结束(start超出返回空列表,包含end,end超出返回所有)
1 2 3 4 127.0.0.1:6379> lrange qhh 0 -1 1) "sex" 2) "age" 3) "name"
lpushx
插入已存在的列表头部,不存在时无效返回0,成功返回列表长度
1 2 3 4 5 6 7 8 9 127.0.0.1:6379> lpushx yhqqhh id (integer) 0 127.0.0.1:6379> lpushx qhh id (integer) 4 127.0.0.1:6379> lrange qhh 0 -1 1) "id" 2) "sex" 3) "age" 4) "name"
rpush
将一个或多个值插入列表尾部,如果key是其他类型报错,成功返回列表数量
1 2 3 4 5 6 7 8 9 127.0.0.1:6379> rpush qhh class curr (integer) 6 127.0.0.1:6379> lrange qhh 0 -1 1) "id" 2) "sex" 3) "age" 4) "name" 5) "class" 6) "curr"
rpushx
插入已存在的列表尾部,不存在时无效返回0,成功返回列表长度
1 2 3 4 5 6 7 8 9 10 11 12 127.0.0.1:6379> rpushx q course (integer) 0 127.0.0.1:6379> rpushx qhh course (integer) 7 127.0.0.1:6379> lrange qhh 0 -1 1) "id" 2) "sex" 3) "age" 4) "name" 5) "class" 6) "curr" 7) "course"
llen
返回列表长度,不存在返回0,不是列表类型报错
1 2 3 4 5 6 127.0.0.1:6379> llen yhq (error) WRONGTYPE Operation against a key holding the wrong kind of value 127.0.0.1:6379> llen qh (integer) 0 127.0.0.1:6379> llen qhh (integer) 7
lpop
移除列表中第一个元素并返回,key不存在返回nil
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 127.0.0.1:6379> lrange qhh 0 -1 1) "id" 2) "sex" 3) "age" 4) "name" 5) "class" 6) "curr" 7) "course" 127.0.0.1:6379> lpop qhh "id" 127.0.0.1:6379> lrange qhh 0 -1 1) "sex" 2) "age" 3) "name" 4) "class" 5) "curr" 6) "course"
rpop
移除列表最后一个元素并返回,key不存在返回nil
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 127.0.0.1:6379> lrange qhh 0 -1 1) "sex" 2) "age" 3) "name" 4) "class" 5) "curr" 6) "course" 127.0.0.1:6379> rpop qhh "course" 127.0.0.1:6379> lrange qhh 0 -1 1) "sex" 2) "age" 3) "name" 4) "class" 5) "curr"
rpoplpush
移除列表最后一个元素,插入到另一个列表头部,返回移除的元素(如果第一个列表为空,返回nil,不执行操作)
1 2 3 4 5 6 7 8 9 10 11 12 13 127.0.0.1:6379> lrange qhh 0 -1 1) "sex" 2) "age" 3) "name" 4) "class" 5) "curr" 127.0.0.1:6379> lrange yhqqhh 0 -1 1) "name" 127.0.0.1:6379> rpoplpush qhh yhqqhh "curr" 127.0.0.1:6379> lrange yhqqhh 0 -1 1) "curr" 2) "name"
lrem
根据count的值,移除列表中与val相等的值(count>0,从头部开始,移除count个和val相等的值,<0从尾部移除count个,=0全部),返回被移除的数量,列表不存在返回0
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 127.0.0.1:6379> lrange qhh 0 -1 1) "age" 2) "name" 3) "name" 4) "name" 5) "name" 6) "sex" 7) "age" 8) "name" 9) "class" 127.0.0.1:6379> lrem qhh 3 name (integer) 3 127.0.0.1:6379> lrange qhh 0 -1 1) "age" 2) "name" 3) "sex" 4) "age" 5) "name" 6) "class"
ltrim
保留区间内的元素,0开始-1结束(超过范围的下标并不会产生错误:如果 start 超过列表尾部,或者 start > end,结果会是列表变成空表(即该 key 会被移除)。 如果 end 超过列表尾部,Redis 会将其当作列表的最后一个元素。)
1 2 3 4 5 6 7 8 9 10 11 12 13 127.0.0.1:6379> lrange qhh 0 -1 1) "age" 2) "name" 3) "sex" 4) "age" 5) "name" 6) "class" 127.0.0.1:6379> ltrim qhh 0 2 OK 127.0.0.1:6379> lrange qhh 0 -1 1) "age" 2) "name" 3) "sex"
lindex
返回索引的值0开始 -1结束(不是列表返回错误,超出长度返回nil)
1 2 3 4 5 6 127.0.0.1:6379> lrange qhh 0 -1 1) "age" 2) "name" 3) "sex" 127.0.0.1:6379> lindex qhh -2 "name"
linsert
在列表某个元素(before/after)插入val,成功返回列表长度,key没有或者列表不存在返回0,元素不存在返回-1,找到一个元素就ok,不会插入多个
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 127.0.0.1:6379> lrange qhh 0 -1 1) "age" 2) "name" 3) "hellow" 4) "sex" 127.0.0.1:6379> lpush qhh name (integer) 5 127.0.0.1:6379> lrange qhh 0 -1 1) "name" 2) "age" 3) "name" 4) "hellow" 5) "sex" 127.0.0.1:6379> linsert qhh after name word (integer) 6 127.0.0.1:6379> lrange qhh 0 -1 1) "name" 2) "word" 3) "age" 4) "name" 5) "hellow" 6) "sex" 127.0.0.1:6379> linsert qh after name 123 (integer) 0 127.0.0.1:6379> linsert qhh after name1 123 (integer) -1
lset
通过索引修改val,成功返回ok,超出索引范围或者空列表返回错误
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 127.0.0.1:6379> lrange qhh 0 -1 1) "name" 2) "word" 3) "age" 4) "name" 5) "hellow" 6) "sex" 127.0.0.1:6379> lset qhh 0 666 OK 127.0.0.1:6379> lset qhh 10 666 (error) ERR index out of range 127.0.0.1:6379> lrange qhh 0 -1 1) "666" 2) "word" 3) "age" 4) "name" 5) "hellow" 6) "sex"
blpop/brpop
移除列表第一个/最后一个元素,如果阻塞(没有元素)等待time秒后返回nil,成功返回两个元素,一个key,一个移除元素(先到先得原则)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 127.0.0.1:6379> lrange qhh 0 -1 1) "666" 2) "word" 3) "age" 4) "name" 5) "hellow" 6) "sex" 127.0.0.1:6379> blpop qhh 10 1) "qhh" 2) "666" 127.0.0.1:6379> blpop list 10 (nil) (10.02s) 127.0.0.1:6379> lrange qhh 0 -1 1) "word" 2) "age" 3) "name" 4) "hellow" 5) "sex"
brpoplpush
从一个列表移到另一个列表,没有等待time秒
1 2 3 4 5 6 7 8 9 127.0.0.1:6379> brpoplpush qhh list 3 "sex" 127.0.0.1:6379> lrange qhh 0 -1 1) "word" 2) "age" 3) "name" 4) "hellow" 127.0.0.1:6379> lrange list 0 -1 1) "sex"
Set(集合) 简介 Redis 的 Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。
Redis 中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。
集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)
集合的性质: 唯一性,无序性,确定性
注: 在string和link的命令中,可以通过range 来访问string中的某几个字符或某几个元素
但是,因为集合的无序性,无法通过下标或范围来访问部分元素。因此想看元素,要么随机先一个,要么全选
使用场景 抽奖,点赞,标签,互相关注,好友推荐
sadd
添加一个或者多个元素到集合中,成功返回新添加到集合的元素数量,已存在的会被忽略,不是集合类型返回错误
1 2 3 4 127.0.0.1:6379> sadd yhq name age sex name (integer) 3 127.0.0.1:6379> sadd yhq id (integer) 1
smembers
返回集合所有元素 (sinter 单个集合)
1 2 3 4 5 6 7 8 9 10 127.0.0.1:6379> smembers yhq 1) "id" 2) "age" 3) "sex" 4) "name" 127.0.0.1:6379> sinter yhq 1) "id" 2) "age" 3) "sex" 4) "name"
scard
返回集合元素数量,不存在返回0
1 2 127.0.0.1:6379> scard yhq (integer) 4
sdiff
返回多个集合的差集,差集结果基于前面的集合
1 2 3 4 5 6 7 8 9 10 11 127.0.0.1:6379> smembers yhq 1) "id" 2) "age" 3) "sex" 4) "name" 127.0.0.1:6379> smembers qhh 1) "id" 2) "name" 127.0.0.1:6379> sdiff yhq qhh 1) "age" 2) "sex"
sdiffstore
将差集(差集结果基于前面的集合)存到指定集合,如果存在覆盖,返回集合元素个数
1 2 3 4 5 6 7 8 9 10 11 12 13 127.0.0.1:6379> smembers yhq 1) "id" 2) "age" 3) "sex" 4) "name" 127.0.0.1:6379> smembers qhh 1) "id" 2) "name" 127.0.0.1:6379> sdiffstore diffs yhq qhh (integer) 2 127.0.0.1:6379> smembers diffs 1) "age" 2) "sex"
sinter
返回指定集合的交集,不存在集合视为空集合,当有空集合时,结果也为空集(key不存在视为空,一个空全是空)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 127.0.0.1:6379> smembers yhq 1) "id" 2) "age" 3) "sex" 4) "name" 127.0.0.1:6379> smembers qhh 1) "id" 2) "name" 127.0.0.1:6379> smembers yhqqhh 1) "age" 2) "id" 3) "name" 127.0.0.1:6379> sinter yhq qhh yhqqhh 1) "id" 2) "name" 127.0.0.1:6379> sinter yhq qhh yhqqhh a (empty list or set)
sinterstore
将交集存到一个集合,存在覆盖,返回集合个数
1 2 3 4 5 127.0.0.1:6379> sinterstore inters yhq qhh yhqqhh (integer) 2 127.0.0.1:6379> smembers inters 1) "id" 2) "name"
sismember
判断是否是集合元素,存在返回1,不存在或者不是返回0
1 2 3 4 127.0.0.1:6379> sismember yhq name (integer) 1 127.0.0.1:6379> sismember yhq name1 (integer) 0
spop
随机移除一个或多个元素,返回移除的元素,集合不存在或者空集合返回nil(srandmember返回随机元素,不对集合修改)[count 3.2+版本可以指定移除数量,count大于集合数返回整个集合]
1 2 3 4 5 6 7 8 9 127.0.0.1:6379> smembers yhq 1) "id" 2) "sex" 3) "name" 127.0.0.1:6379> spop yhq "name" 127.0.0.1:6379> smembers yhq 1) "id" 2) "sex"
srandmember
返回集合的随机元素(2.6+版本开始增加count) 如果count为正数,且小于集合基数,返回一个包含count的数组,数组中元素各不相同,如果count大于集合基数,返回整个集合,count为负数,返回一个数组,数组可能重复,长度为count绝对值 只提供key,返回一个元素,集合为空,返回nil,提供count返回一个数组,集合为空数组
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 127.0.0.1:6379> smembers yhq 1) "age" 2) "id" 3) "name" 4) "sex" 127.0.0.1:6379> srandmember yhq 2 1) "id" 2) "age" 127.0.0.1:6379> srandmember yhq 2 1) "id" 2) "name" 127.0.0.1:6379> srandmember yhq -3 1) "age" 2) "sex" 3) "age"
smove
将m元素从一个a集合移到另一个b集合,如果a集合不存在m,命令不执行,返回0。否则m从a移到b,当b中以包含m时,命令仅是从a中移除m,ab不是集合类型,返回错误
1 2 3 4 5 6 7 8 9 127.0.0.1:6379> smembers qhh 1) "id" 2) "name" 127.0.0.1:6379> smove yhq qhh age (integer) 1 127.0.0.1:6379> smembers qhh 1) "age" 2) "id" 3) "name"
srem
从集合移除一个或者多个元素,不存在元素忽略,不是集合类型返回错误,集合不存在返回0,>=2.4可以移除多个元素
1 2 3 4 5 6 7 8 9 10 127.0.0.1:6379> smembers qhh 1) "age" 2) "id" 3) "sex" 4) "name" 127.0.0.1:6379> srem qhh age id (integer) 2 127.0.0.1:6379> smembers qhh 1) "sex" 2) "name"
sunion
返回集合并集
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 127.0.0.1:6379> smembers yhq 1) "age" 2) "id" 3) "name" 4) "sex" 127.0.0.1:6379> smembers qhh 1) "sex" 2) "name" 127.0.0.1:6379> smembers yhqqhh 1) "age" 2) "id" 3) "name" 127.0.0.1:6379> sunion yhq qhh yhqqhh 1) "age" 2) "id" 3) "name" 4) "sex"
sunionstore
将集合并集存储到指定集合中,如果存在覆盖
1 2 3 4 5 6 7 127.0.0.1:6379> sunionstore sst yhq qhh yhqqhh (integer) 4 127.0.0.1:6379> smembers sst 1) "age" 2) "id" 3) "name" 4) "sex"
sscan
迭代集合元素
1 2 3 4 5 127.0.0.1:6379> sscan yhq 0 match a* 1) "0" 2) 1) "age" 2) "add" 3) "apple"
zset(有序集合) 简介 Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。
有序集合的成员是唯一的,但分数(score)却可以重复。
集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。 集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)
使用场景 排行榜
zadd
将一个或多个成员及成绩加入有序集合,如果有分数则更新,分数可以是整型或者双精度浮点,返回新增的成员数,已存在的不算,返回新增成员数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 > zadd yhq 100 yhq 99 qhh 98 yjz 97 zhw (integer) 4 #新增 > zadd yhq 101 qhh (integer) 0 #修改 > zrange yhq 0 -1 withscores 1) "zhw" 2) 97.0 3) "yjz" 4) 98.0 5) "yhq" 6) 100.0 7) "qhh" 8) 102.0 > zadd yhq xx 666 yhq 777 ldy (integer) 0 #仅更新 > zrange yhq 0 -1 withscores 1) "zhw" 2) 97.0 3) "yjz" 4) 98.0 5) "qhh" 6) 102.0 7) "yhq" 8) 666.0 > zadd yhq nx 555 yhq 777 ldy (integer) 1 #仅新增 > zrange yhq 0 -1 withscores 1) "zhw" 2) 97.0 3) "yjz" 4) 98.0 5) "qhh" 6) 102.0 7) "yhq" 8) 666.0 9) "ldy" 10) 777.0 > zadd yhq incr 666 yhq (integer) 1332 #递增,返回递增值 > zrange yhq 0 -1 withscores 1) "zhw" 2) 97.0 3) "yjz" 4) 98.0 5) "qhh" 6) 102.0 7) "ldy" 8) 777.0 9) "yhq" 10) 1332.0 > zadd yhq ch 666 yhq 555 ymx (integer) 2 #返回增加和修改的成员数(原始只返回新增数) > zrange yhq 0 -1 withscores 1) "zhw" 2) 97.0 3) "yjz" 4) 98.0 5) "qhh" 6) 102.0 7) "ymx" 8) 555.0 9) "yhq" 10) 666.0 11) "ldy" 12) 777.0
zcard
获取集合数量,否则返回0
1 2 127.0.0.1:6379> zcard cj (integer) 2
zrange
按索引获取集合 按分数由小到大,相同分数按字典序排列 [withscores]
1 2 3 4 5 6 7 8 127.0.0.1:6379> zrange cj 0 -1 1) "yhq" 2) "qhh" 127.0.0.1:6379> zrange cj 0 -1 withscores 1) "yhq" 2) "98" 3) "qhh" 4) "99"
zrevrange
按索引获取集合 按分数由大到小,相同分数按字典序排列 [withscores]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 127.0.0.1:6379> zrange myset 0 -1 withscores 1) "one" 2) "1" 3) "two" 4) "2" 5) "three" 6) "3" 127.0.0.1:6379> zrevrange myset 0 -1 1) "three" 2) "two" 3) "one" 127.0.0.1:6379> zrevrange myset 2 3 1) "one" 127.0.0.1:6379> zrevrange myset -2 -1 1) "two" 2) "one"
zrank
获取成员排名,由小到大
1 2 3 4 5 6 7 8 9 127.0.0.1:6379> zrange cj 0 -1 withscores 1) "ys" 2) "-5" 3) "qhh" 4) "94" 5) "yhq" 6) "98" 127.0.0.1:6379> zrank cj ys (integer) 0
zrevrank
获取成员的排名,由大到小
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 127.0.0.1:6379> zrange cj 0 -1 withscores 1) "yhq" 2) "98" 3) "qhh" 4) "99" 127.0.0.1:6379> zrange fs 0 -1 withscores 1) "qhh" 2) "100" 3) "yhq" 4) "100" 127.0.0.1:6379> zrevrank fs yhq (integer) 0 127.0.0.1:6379> zrevrank fs qhh (integer) 1 127.0.0.1:6379> zrevrank cj yhq (integer) 1 127.0.0.1:6379> zrevrank cj qhh (integer) 0
zcount
返回指定分数区间内成员数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 > zrange yhq 0 -1 withscores 1) "zhw" 2) 97.0 3) "yjz" 4) 98.0 5) "qhh" 6) 102.0 7) "ymx" 8) 555.0 9) "yhq" 10) 666.0 11) "ldy" 12) 777.0 > zcount yhq -inf +inf 6 > zcount yhq (100 102 1
zincrby
对集合指定成员增加分数,可以是负数,不存在则添加,返回新的值,不是有序集合返回错误
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 127.0.0.1:6379> zrange cj 0 -1 withscores 1) "yhq" 2) "98" 3) "qhh" 4) "99" 127.0.0.1:6379> zincrby cj -5 qhh "94" 127.0.0.1:6379> zincrby cj -5 ys "-5" 127.0.0.1:6379> zrange cj 0 -1 withscores 1) "ys" 2) "-5" 3) "qhh" 4) "94" 5) "yhq" 6) "98"
zlexcount
返回成员区间个数
成员名称前需要加 [ 符号作为开头, [ 符号与成员之间不能有空格
可以使用-和+表示最大最小值
计算成员之间的成员数量时,min和max也计算在内
1 2 3 4 5 6 7 8 9 127.0.0.1:6379> zrange cj 0 -1 withscores 1) "ys" 2) "-5" 3) "qhh" 4) "94" 5) "yhq" 6) "98" 127.0.0.1:6379> zlexcount cj - + (integer) 3
zscore
返回集合成员分数
1 2 3 4 5 6 7 8 9 10 11 127.0.0.1:6379> zrange cj 0 -1 withscores 1) "ys" 2) "-5" 3) "qhh" 4) "94" 5) "yhq" 6) "98" 127.0.0.1:6379> zscore cj qh (nil) 127.0.0.1:6379> zscore cj qhh "94"
zrangebylex / zrevrangebylex
根据正序/ 降序数据字典返回成员,分数必须相同(用户电话排序,获取某号段[号码为k,v全部为0],获取姓名A的所有人 [A (B)
分数必须相同!!!,如果分数不一致,返回结果不准
成员字符串作为二进制字节数比较,默认是ASCII字符集,如果包含utf8字符集,影响返回结果,建议不要使用
默认情况下,max和min参数前必须加 [,与成员之间不能有空格(包含) (不包含,+-表示最大最小,不能反,会导致结果空
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 127.0.0.1:6379> zadd zset 0 a 0 aa 0 abc 0 apple 0 b 0 c 0 d 0 d1 0 dd 0 dobble 0 z 0 z1 (integer) 12 127.0.0.1:6379> zrangebylex zset - + 1) "a" 2) "aa" 3) "abc" 4) "apple" 5) "b" 6) "c" 7) "d" 8) "d1" 9) "dd" 10) "dobble" 11) "z" 12) "z1" 127.0.0.1:6379> zrangebylex zset [aa (c limit 3 2 1) "b" 127.0.0.1:6379> zrangebylex zset + - limit 3 2 (empty list or set) 127.0.0.1:6379> zrangebylex zset - + limit 3 2 1) "apple" 2) "b"
zrangebyscore
按成绩返回列表,由小到大,可以分页
1 2 3 4 5 6 7 8 9 10 11 12 13 127.0.0.1:6379> zadd myset 1 "one" (integer) 1 127.0.0.1:6379> zadd myset 2 "two" (integer) 1 127.0.0.1:6379> zadd myset 3 "three" (integer) 1 127.0.0.1:6379> zrangebyscore myset -inf +inf 1) "one" 2) "two" 3) "three" 127.0.0.1:6379> zrangebyscore myset 1 2 1) "one" 2) "two"
zrem
移除一个或者多个成员
1 2 3 4 5 6 7 8 9 10 11 12 13 14 127.0.0.1:6379> zrange cj 0 -1 withscores 1) "ys" 2) "-5" 3) "qhh" 4) "94" 5) "yhq" 6) "98" 127.0.0.1:6379> zrem cj ys yy (integer) 1 127.0.0.1:6379> zrange cj 0 -1 withscores 1) "qhh" 2) "94" 3) "yhq" 4) "98"
zremrangebylex
移除有序集合中给定的字典区间的所有成员
成员字符串作为二进制字节数比较,默认是ASCII字符集,如果包含utf8字符集,影响返回结果,建议不要使用
默认情况下,max和min参数前必须加 [,与成员之间不能有空格(包含) (不包含,+-表示最大最小,不能反,会导致结果空
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 redis 127.0.0.1:6379> ZADD myzset 0 aaaa 0 b 0 c 0 d 0 e (integer) 5 redis 127.0.0.1:6379> ZADD myzset 0 foo 0 zap 0 zip 0 ALPHA 0 alpha (integer) 5 redis 127.0.0.1:6379> ZRANGE myzset 0 -1 1) "ALPHA" 2) "aaaa" 3) "alpha" 4) "b" 5) "c" 6) "d" 7) "e" 8) "foo" 9) "zap" 10) "zip" redis 127.0.0.1:6379> ZREMRANGEBYLEX myzset [alpha [omega (integer) 6 redis 127.0.0.1:6379> ZRANGE myzset 0 -1 1) "ALPHA" 2) "aaaa" 3) "zap" 4) "zip"
zremrangebyrank
移除指定排名区间的成员,返回移除数量
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 127.0.0.1:6379> zrange cj 0 -1 withscores 1) "yh" 2) "12" 3) "ys" 4) "45" 5) "qhh" 6) "94" 7) "yhq" 8) "98" 127.0.0.1:6379> zremrangebyrank cj 0 1 (integer) 2 127.0.0.1:6379> zrange cj 0 -1 withscores 1) "qhh" 2) "94" 3) "yhq" 4) "98"
zremrangebyscore
移除分数区间的成员
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 127.0.0.1:6379> zrange cj 0 -1 withscores 1) "yh" 2) "12" 3) "ys" 4) "45" 5) "qhh" 6) "94" 7) "yhq" 8) "98" 127.0.0.1:6379> zremrangebyscore cj 30 50 (integer) 1 127.0.0.1:6379> zrange cj 0 -1 withscores 1) "yh" 2) "12" 3) "qhh" 4) "94" 5) "yhq" 6) "98"
zinterstore
获取多个集合的交集存到另一个集合
ZINTERSTORE destination numkeys key [key …] [WEIGHTS weight] [SUM|MIN|MAX]
在给定要计算的key和其他参数之前,必须先给定key的个数(numberkeys) 默认情况下,结果中一个元素的分数是有序集合该元素分数之和,前提是该元素在这些有序集合中都存在,如果destination存在则覆盖
使用WEIGHTS选择,为每个给定的有序集合指定一个乘法因子,在传递给聚合函数之前都先乘以该因子,没有给定默认1
使用AGGREGATE选择,给定聚合方式,默认sum,如果是min最小,max最大
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 127.0.0.1:6379> zadd zset1 1 "one" (integer) 1 127.0.0.1:6379> zadd zset1 2 "two" (integer) 1 127.0.0.1:6379> zadd zset2 1 "one" (integer) 1 127.0.0.1:6379> zadd zset2 2 "two" (integer) 1 127.0.0.1:6379> zinterstore out 2 zset1 zset2 weights 2 3 (integer) 2 127.0.0.1:6379> zrange out 0 -1 withscores 1) "one" 2) "5" 1*2+1*3 3) "two" 4) "10" 2*2+2*3
zunionstore
获取多个集合的并集存到另一个集合 ZUNIONSTORE destination numkeys key [key …] [WEIGHTS weight] [SUM|MIN|MAX]
在给定要计算的key和其他参数之前,必须先给定key的个数(numberkeys) 默认情况下,结果中一个元素的分数是有序集合该元素分数之和,前提是该元素在这些有序集合中都存在,如果destination存在则覆盖
使用WEIGHTS选择,为每个给定的有序集合指定一个乘法因子,在传递给聚合函数之前都先乘以该因子,没有给定默认1
使用AGGREGATE选择,给定聚合方式,默认sum,如果是min最小,max最大
1 2 3 4 5 6 7 8 9 127.0.0.1:6379> zunionstore out 2 zset1 zset2 weights 2 3 (integer) 3 127.0.0.1:6379> zrange out 0 -1 withscores 1) "one" 2) "5" 3) "three" 4) "9" 5) "two" 6) "10"
zpopmax / zpopmin
删除并返回有序集合key中最多个count个具有最高(低)分的成员,未指定count为1,大于集合基数不报错,返回多个元素时,得分最高的元素将是第一个元素
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 127.0.0.1:6379> zrange zset 0 -1 withscores 1) "one" 2) "1" 3) "two" 4) "2" 5) "three" 6) "3" 7) "four" 8) "4" 127.0.0.1:6379> zpopmax zset 2 1) "four" 2) "4" 3) "three" 4) "3" 127.0.0.1:6379> zpopmin zset 2 1) "one" 2) "1" 3) "two" 4) "2"