概述
因为redis是单线程执行,所以不用关心并发问题。
简单记录一下redis的操作命令,留作查阅,回头再整理一下事物等操作。
reids中存储的是kev-value形式, 其中的value有几种:
- 字符串: 就是简单的string
- 字符串列表: 有序可重的列表
- 字符串集合: 无序去重的
- 字符串有序集合: 有序去重的
- 哈希: 存储一张哈希表
- HyperLogLog: 基数操作,即获取去重集合中的元素个数
各类型存储命令介绍
字符串
简单的字符串存储了
字符串操作
新建
set key value
: 设置valuesetex key 2 value
: 设置value,并设置过期时间为2spsetex key 2000 value
: 设置value,并设置过期时间为2000mssetnx key value
: 设置value,当key存在时不设置append key value
: 若key存在,将将value拼到原值后边,否则直接设置
更新
getset key value
: 设置value并返回旧的valuesetrange key 2 value
: 更新,将value拼到原值偏移量2的后边
查询
get key
: 获取valuegetrange key 2 3
: 获取value的2-3的字串, 下标从0开始, 负数表示从后往前strlen key
: 获取字符串长度
字符串批量操作
mset key1 value1 [key2 value2 ...]
: 批量设置msetnx key1 value1 [key2 value2 ...]
: 批量设置,当key存在时不覆盖mget key1 [key2 ...]
: 批量获取
字符串位操作
比如设置一篇文章的是否阅读, 可以将用户的id作为偏移量, 1表示阅读过, 0表示没有阅读
getbit key offset
: 返回偏移量上的值,0或1setbit key offset 1
: 设置偏移量上的值
计数操作
简单理解就是存个数字,因为redis是单线程,所以也可以用它来防并发
incr key
: +1,不存在时为0+1incrby key 2
: +2incrbyfloat key 2.4
: +2.4decr key
: -1decrby key 2.4
: -2.4
列表
列表是一个有序可重复的集合,可以参考java中的 List
插入
linsert key before(after) value1 value
: 在value1的前边(后边)插入value,若成功,返回列表的新长度,若失败返回-1,若列表为空,返回0lpush key value1 [value2 ...]
: 将值插入到列表头部rpush key value1 [value2 ...]
: 将值插入到列表尾部lpushx key value
: 将值插入列表的头部,若列表不存在,操作无效rpushx key value
: 将值插入列表的尾部,若列表不存在,操作无效lset key 2 value
: 设置列表下标为2的值
删除
lrem key count value
: 删除列表中的value- count:删除的个数,整数从前往后,负数从后往前,0删除所有
ltrim key 2 3
: 列表只保留2-3的元素,删除其余元素
查询
blpop key1 [key2 ...] timeout
: 获取并移除列表的第一个元素,阻塞timeout秒,若没有拿到,返回nilbrpop key1 [key2 ...] timeout
: 获取并移除列表的最后一个元素,阻塞brpoplpush key1 key2 timeout
: 从key1中弹出(删除)最后一个值插入到key2中,若timeout秒没有拿到,返回nillpop key
: 弹出列表的第一个元素rpop key
: 弹出列表的最后一个元素rpoplpush key1 key2
: 从key1中弹出最后一个元素插入到key2中lindex key 2
: 获取列表下标为2的元素llen key
: 获取列表长度lrange key 2 3
: 获取列表2-3的元素,负数从后往前
集合
集合是一个无序去重的,可参考java中的HashSet
更新
sadd key value1 [value2 ...]
: 插入元素smove key1 key2 value
: 将value从key1移到key2,若key1中value不存在,则不执行操作srem key value1 [value2 ...]
: 将元素从集合中删除
查询
多个集合操作
sdiff key1 [key2 ...]
: 返回所有集合的差集(值在key1中,不在其他集合中0)sdiffstore newKey key1[key2 ...]
: 返回所有集合的差集,将结果存储到newKey中sinter key1 [key2 ...]
: 返回所有集合的交集(值再每一个集合中都存在)sinterstore newKey key1 [key2 ...]
: 返回所有集合的交集,将结果存储到newKey中sunion key1 [key2 ...]
: 返回所有集合的并集sunionstrore newKey key1 [key2 ...]
: 返回所有集合的并集,将结果存储到newKey中
获取元素
spop key [count]
: 从集合中随机弹出一个元素, 若指定count,则弹出count个元素srandmember key [count]
: 从集合中随机获取一个元素,若指定count,则获取count个元素,与 spop 不同,此命令不会删除元素scard key
: 获取集合元素数sismember key value
: 查看value是否在集合中smembers key
: 获取集合所有元素sscan key cursor [match h*] [count count]
: 迭代集合中的元素- cursor:游标,使用命令返回的新游标作为下一次迭代的游标,当返回为0时,迭代完成
- count:指定返回的元素数量,默认为10,每次迭代获取的数量可以不相同
- match:对返回的元素进行筛选,因为是在返回结果后进行筛选,所以可能返回空
有序集合
有序集合是去重有序,可参考java中的LindedHashSet
redis中的有序集合通过给每个元素设置一个关联的分数,通过分数进行排序,当分数相同时,通过自然排序,即abcd
更新
zadd key score1 value1 [score2 value2 ...]
: 添加元素,若存在更新分数zincrby key 2.3 value
: value的分数+2.3,若value不存在等同于add
删除
zrem key value1 [value2 ...]
: 删除集合中的元素zremrangebylex key min max
: 删除集合中指定范围的元素,(min max 参考 zlexcount)zremrangebyrank key 2 3
: 删除集合排名2-3的元素zremrangebyscore key min max
: 删除集合中指定范围分数的元素,(min max 参考 zlexcount)
查询
获取个数
zcard key
: 获取集合大小zcount key 2 3
: 获取集合中分数在2-3的元素数量zlexcount key min max
: 获取集合中成员在min-max之间的成员数量- min:-(负无穷), [a(最小值为a元素,闭区间), (a(开区间)
- max: +(正无穷), [a, (a 同上
多个集合操作
zinterstore newKey num key1 [key2 ...]
: 计算多个集合的交集,将结果存储到newKey中,结果集元素的分数为各集合元素分数和,num指定后边跟了几个集合zunionstore newKey num key1 [key2 ...]
: 计算多个集合的并集,将结果存储到newKey中,结果集元素的分数为各集合元素分数和,num指定后边跟了几个集合
获取范围元素
zrange key 2 3 [withscores]
: 获取集合中排序为2-3的元素,负数从后往前,按分数从小到大排序- withscores:返回分数值
zrevrange key 2 3 [withscores]
: 类似 zrange, 分数从大到小排序zrangebylex key min max [limit offset count]
: 返回集合中指定范围的元素,(min max 参考 zlexcount)- limit offset count: 可参考sql
zrangebyscore key min max
: 返回集合中指定分数范围的元素,(min max 参考 zlexcount)zrevrangebyscore key max min [withscores]
: 类似 zrangebyscore, 分数从大到小
获取元素信息
zrank key value
: 返回value的排名zrevrank key value
: 返回value的排名,分数从大到小zscore key value
: 返回value的分数zscan key cursor [match h*] [count count]
: 迭代集合,参数参考 sscan
哈希
存储一张哈希表,简单说就是多个kay-value对,可以用来存储对象属性等
更新
hmset key field1 value1 [field2 value2 ...]
: 批量设置键值对hset key field value
: 设置键值对hsetnx key field value
: 设置键值对,若已存在则不设置hincrby key field 2
: 给字段+2hincrbyfloat key field 2.4
: 给字段+2.4
删除
hdel key field1 [field2 ...]
: 删除哈希表的字段
查询
hlen key
: 获取字段数量hexists key field
: 查看哈希表中field字段是否存在hget key field
: 获取哈希表中字段的值hkeys key
: 获取所有字段hvals key
: 获取所有值hgetall key
: 获取哈希表的所有字段和值hmget key field1 [field2 ...]
: 获取所有给定字段的值hscan key cursor [match h*] [count count]
: 迭代,参数参考 sscan
HyperLogLog
HyperLogLog(什么鬼名字)是用来做基数统计的,也就是统计一个去重的集合中元素的个数,那直接使用集合不就好了?
使用集合的话,每个元素都进行存储,若需要做大量统计,则十分耗费内存,HyperLogLog并不直接存储元素,不管有多少元素(2^64)都只需要12KB内存空间,也正因如此,并不能通过这个结构直接返回元素,只能计算其中元素的个数,但只是估算,可以理解。
pfadd key value1 [value2 ...]
: 将元素添加pfcount key1 [key2 ...]
: 返回基数估算值,若多个则返回估算值得和pfmerge newKey key1 [key2 ...]
: 将多个合并为一个,存到newKey中
通用命令
更新
del key
: 删除键unlink key
: 删除 key(异步, 不会阻塞主线程)expire key 2
: 为key设置2s过期时间pexpire key 2000
: 为key设置2000ms过期时间expireat key timestamp
: 为key设置过期时间,指定时间戳过期pexpireat key millseconds-timestamp
: 为key设置过期时间,毫秒级时间戳(没用过)persist key
: 移除key过期时间ttl key
: 获取key的剩余过期时间pttl key
: 获取key的毫秒级剩余过期时间move key 2
: 将key移动到2库中rename key newKey
: 重命名renamenx key newKey
: 重命名,若newKey存在则不操作
查询
dump key
: 返回序列化的值exists key
: 查看key是否存在keys pattern
: 获取所有符合匹配的key- pattern:
*
表示所有,h*
h开头, 等等
- pattern:
randomkey
: 从当前库随机返回一个keytype key
: 返回存储的数据类型dbsize
: 返回当前库的 key 数量
库
select 1
: 选择1库