通用命令
# 查看当前库中key的数量
dbsize
# 清空当前库
flushdb
# 清空所有库
flushall
# 查看当前库下所有key
keys *
# 当前库下是否有指定key
exists key1
# 查看key的值类型
type key1
# 删除key
del key1
# 设置指定key的过期时间,单位秒
expire key1 10
# 查看key的剩余过期时间,-1表示永不过期,-2表示已过期
ttl key1
# 监视key
watch key1
# 取消监视key
unwatch key1
复制代码
数据结构和命令
string
是key/value的数据结构,一个key对应一个string类型的value,单个value最大512M
这个是最常用的数据结构了
命令
# 设置key/value
set key1 value1
# 设置key/value的同时设置过期时间
setex key1 10 value1
# 获取key的值
get key1
# 设置新值,同时返回旧值
getset key1 value1
# 一次设置多个key/value,后面的....表示还可以写key3 value3等
mset key1 value1 key2 value2 ...
# 一次获取多个key的值
mget key1 key2
# 追加内容到指定key的值后面
append key1 xxx
# 获取值的长度
strlen key1
# 只有在key不存在时才成功
setnx key1 value1
# 只有在所有key不存在时才成功
msetnx key1 value1 key2 value2 ...
# 给指定key的值加1
incr key1
# 减1
decr key1
# 给指定key的值加指定数值,本例是加2
incrby key1 2
# 给指定key的值减指定数值,本例是减2
decrby key1 2
# 获取指定key的值中指定范围的字符,如值为abcdefg,取1至2返回bc,即包含1和2两个位置的字符
getrange key1 1 2
# 设置指定位置的值,指定开始位置,然后直接覆盖,如下例中值为abcdefg,从第1个位置开始覆盖为cb,则结果为acbdefg
setrange key1 1 cb
复制代码
list
双向链表,无序可重复的集合,一般用来做队列
命令
# 从表头添加元素,value2是新的表头
lpush key1 value1 value2 ...
# 从表尾添加元素,value2是新的表尾
rpush key1 value1 value2 ...
# 从表头弹出元素
lpop key1
# 从表尾弹出元素
rpop key1
# 从key1表尾弹出一个元素,再加到key2表头
rpoplpush key1 key2
# 从表中查看指定索引的范围的元素
lrange key1 0 2
# 查看整个链表
lrange key1 1 0 -1
# 获取链表中从左向右指定索引的元素
lindex key1 1
# 获取链表中最后一个元素
lindex key1 -1
# 获取链表长度
llen key1
# 向链表中的value1前面插入value2
linsert key1 before value1 value2
# 向链表中value1后面插入value2
linsert key1 after value1 value2
# 从链表中删除一个值为value1的元素,从左向右
lrem key1 1 value1
# 从链表中删除一个值为value1的元素,从右向左
lrem key1 -1 value1
# 删除链表中所有值为value1的元素
lrem key1 0 value1
复制代码
set
无序不可重复的集合,常用来排除重复数据和随机抽奖功能
命令
# 向集合中添加元素,重复元素会自动跳过
sadd key1 value1 value2 ...
# 取出集合所有元素
smembers key1
# 判断集合中是否存在某个元素
sismember key1 value1
# 获取集合中的元素个数
scard key1
# 从集合中删除指定元素
srem key1 value1 value2 ...
# 随机从集合中弹出一个元素并删除该元素
spop key1
# 随机从集合中取出元素,但不会删除元素,后面的1表示取出元素的个数
srandmember key1 1
# 求两个集合交集
sinter key1 key2
# 求两个集合并集
sunion key1 key2
# 求两个集合差集
sdiff key1 key2
复制代码
zset
有序不可重复的集合,常用来做排行榜
命令
# 添加元素,相同value不同score会覆盖score
zadd key1 score1 value1 score2 value2
# 获取元素数量
zcard key1
# 取出全部元素,从小到大
zrange key1 0 -1
# 取出部分元素,从小到大
zrange key1 0 4
# 取出全部元素,从大到小
zrevrange key1 0 -1
# 取出部分元素,从大到小
zrevrange key1 0 4
# 取出score在指定范围内的元素,从小到大,其中min和max是score的范围
zrangebyscore key1 min max withscores
# 取出score在指定范围内的元素,从大到小
zrevrangebyscore key1 max min withscores
# 为指定value的元素的score递增,其中1是每次递增多少,可以为负数
zincrby key1 1 value1
# 删除指定元素
zrem key1 value1
# 统计集合中score在范围内的元素个数
zcount key1 min max
# 返回指定值在集合中的排名,从小到大,排名从0开始
zrank key1 value1
# 返回指定值在集合中的排名,从大到小
zrevrank key1 value1
复制代码
hash
类似于Java中的Map<String, String>
命令
# 添加一个键值对
hset key1 field1 value1
# 获取键值
hget key1 field1
# 批量设置键值对
hmset key1 field1 value1 field2 value2 ...
# 检查键是否存在
hexists key1 field1
# 获取所有键
hkeys key1
# 获取所有值
hvals key1
# 键值递增,后面的1表示每次递增多少,可以为负数,当是负数时表示递减
hincrby key1 field1 1
# 键不存在时成功
hsetnx key1 field1 value1
# 获取所有键值对,奇数为键,偶数为值
hgetall key1
复制代码
bitmap
bitmap以bit为单位设置各个位的值(要么是0,要么是1),根据实际应用场景可以设计出节省空间的算法,如布隆过滤器,本文以记录用户签到为例,假设用户ID为1,每年一个key,并且key=用户ID_年份,如1_2021
ID=1的用户在2021-01-01这一天签到,这一天是2021年第1天(也就是第0天),可以执行以下命令,保存签到记录
# 设置1_2021这个key的第0个bit值为1,以此表示第0天签到成功
setbit 1_2021 0 1
复制代码
该用户在2021-01-03这一天签到,则执行以下命令
# 设置1_2021这个key的第2个bit值为1,以此表示第2天签到成功
setbit 1_2021 2 1
复制代码
现在想查询该用户在2021年的签到情况,可通过get命令实现
get 1_2021
# 输出\xa0
复制代码
get命令输出0xa0
,这是十六进制,转成二进制,就是10100000
,二进制中为1的位就表示那一天签到了,所以第0天和第2天签到了
判断该用户2021-01-03是否签到
getbit 1_2021 2
复制代码
统计该用户2021年有多少次签到,实际上是统计有多个位是1
bitcount 1_2021
# 输出2
复制代码
统计该用户指定日期范围内的签到次数,这个不太好实现,redis提供的命令中指定范围的单位是byte,比如统计2021年1月的次数,就是第0个字节到第3个字节(第0 1 2 3共4个字节),这样多统计了1天,即把2021-02-01这一天也统计进来,如下:
# 统计第0到第3个字节中为1的位个数,包含第3个字节
bitcount 1_2021 0 3
复制代码
这种情况要么按月来设定key值,要么单独查询2021-02-01这一天是否签到,如果签到则总次数就减1
通过上面的例子,可以看到以bit为单位存储非常节省空间,用8个bit就可以表示8天内的签到情况。也可以用bitmap来存储所有用户一天内的签到情况,这种就以用户ID作为bit的偏移量,如果用户ID很大,超过了bitmap的最大范围,可以通过用户ID分片到不同的bitmap上
地理位置
在同一个key内添加多个位置(经纬度),计算位置各个位置之间的距离,也可指定圆心按半径查找符合条件的位置,可实现附近的xxx功能
命令
# 向key1添加一个叫company的位置,经纬度为116.404844 39.915378
geoadd key1 116.404844 39.915378 company
# 向key1添加一个叫home的位置,经纬度为116.370924 39.930871
geoadd key1 116.370924 39.930871 home
# 查询指定位置的经纬度
geopos key1 company
# 查询多个位置的经纬度
geopos key1 company home
# 计算两个位置的距离,单位是m
geodist key1 company home
# 计算两个位置的距离,指定单位为km
geodist key1 company home km
# 以指定经纬度为圆心,查询指定半径内的所有位置,其中116.370924 39.930871是圆心点的经纬度,2000 m是半径大小,单位m,withdist表示输出符合条件的位置与圆心的距离,withcoord表示输出符合条件的位置的经纬度,asc表示按距离从小到大排序
georadius key1 116.370924 39.930871 2000 m withdist withcoord asc
# 以指定位置为圆心,查询指定半径内的所有位置,返回结果中包含圆心自身,其他可选参数与上一条georadius相同
georadiusbymember key1 home 4000 m
面试题集合