Redis容器安装及常见命令(持续更新)
容器安装
启动redis
docker run -d \
--name ivan_redis \
-v /root/dockerData/ivan_redis:/data \
-p 6380:6379 \
redis:latest
进入容器
docker exec -it myredis /bin/bash
字符串
-- 设置指定的key值
set key1 value1
-- 获取指定key值
get key1
-- 删除指定key值
del key1
-- 只有key不存在时设置key的值
setnx not_exist_key 1
get not_exist_key
-- 设值并设置key的过期时间为seconds(以秒为单位)setex key1 seconds value
setex ex_key1 30 value1
-- 设置过期时间 expire key seconds
expire key 20
-- exists key 判断key是否存在
exists key1
-- 获取过期时间 -2过期或不存在 -1不会过期
ttl key
get key1
-- INCR key 将key中存储的数字值增1,并返回
set int_key 1
incr int_key
-- DECR key 将key中存储的数字值减1,并返回
decr int_key
-- strlen key 返回key所存储的字符串长度
strlen int_key
-- append key value 如果key已经存在并且是个字符串,append命令将value追加到key原来的值的末尾,并返回追加后的长度
append key value111
get key
-- getrange key start end 返回key中字符串值的子字符串
getrange key 0 1
-- getbit key offset 对key所存储的字符串信息,获取指定偏移量上的位(bit)
getbit key 3
-- setbit key offset value 对key所存储的字符串值,设置或清除指定偏移量上的位(bit)
setbit key 3 0
-- mget key[key2] 获取所有(一个或多个)给定key的值
mget key key1 int_key
-- mset 批量设值
mset key1 vlaue1 key2 value2
mget key1 key2
-- psetex key milliseconds vlaue 这个命令和setex命令相似,但是指定的时间为毫秒
psetex key_mill 10000 value1
ttl key_mill
-- incrby key increment 将key所存储的值加上给定的增量值(increment)
incrby int_key 100
-- incrbyfloat key incremnt 增量为浮点增量值
incrbyfloat int_key 100.212340
get int_key
列表
-- redis列表是一个双向链表,可以实现左右增删
-- 信息流展示:最新文章、最新动态等 lpush+lrange
lpush message 1 2 3
-- 0 -1 是范围 0是第一个元素下标,-1是最后一个下标,-2是倒数第二个下标
-- 获取所有元素
lrange message 0 -1
-- 获取头两个元素
lrange message 0 1
-- 获取最后一个元素
lrange message -1 -1
-- 获取部分元素 第二个开始到倒数第二个,去掉最高分去掉最低分
lrange message 1 -2
-- 实现栈(先进后出)lpush+lpop
lpush stack1 1 2 3
lpop stack1
-- 实现队列(先进先出)lpush+rpop
lpush queue1 1 2 3
rpop queue1
rpush key vlaue1 [...] 在列表中添加一个或多个值
-- lpop key 移除并获取列表的第一个元素
lpop message
-- rpop key 移除并获取列表最后一个元素
rpop message
-- llen key 获取列表长度
llen message
哈希表
-- 将哈希表key中的字段field的值设置为value hset key field1 value1 fiedl2 value2
hset key field1 value1 fiedl2 value2
hgetall key
hset user:001 name dyf age 25
-- 获取在哈希表中指定key的所有字段和值
hgetall user:001
hget user:001 name
hget user:001 age
-- 实现购物车
-- 添加商品
hset cart:001 手机a 2
hset cart:001 电脑a 1
-- 查看购物车
hgetall cart:001
-- 购物车商品类型数量
hlen cart:001
-- 增加数量 hincrby key field1 increment 增加浮点增量 hincrbyfloat key field increment_float
hincrby cart:001 手机a 10
-- 获取哈希表中所有的值
hvals user:001
-- hsetnx key field value 只有在字段field不存在时,设置哈希表字段的值
-- false
hsetnx key field1 vulue_new
-- true
hsetnx key field3 vulue_new
-- 查看哈希表中key,指定的字段是否存在
hexists key field4
-- 获取哈希表中所有字段
hkeys key
-- 获取哈希表中字段的数量
hlen key
-- hmget key field1 [field2...] 获取给定字段的值
hmget key field1 field2
-- 同时设置多个值到哈希表
hmset key field1 value1 field2 value2
集合
-- redis中的Set类型是一种无序集合,集合中的元素唯一,也就是集合中的元素是无重复的,有点类似java中的hashset
-- 应用场景1:需要随机获取数据源中的元素的场景,比如抽奖系统
-- 相关命令:sadd(加入抽奖系统)smembers(查看所有抽奖用户)spop(随机获取集合中的元素并移除,适合不允许重复中奖的场景)
sadd choujiang user1 user2 user3
smembers choujiang
-- 随机获取,不会移除,不传2 默认返回1个 srandmember key [count]
srandmember choujiang 2
-- 随机获取2个,并弹出,不传默认弹出1个 spop key [count]
spop choujiang 2
-- 应用场景2:需要存放的数据不能重复的场景,比如文章点赞,朋友圈点赞等
-- 相关命令:sadd(点赞)srem(移除点赞)sismember(检查用户是否点赞过)smembers(获取点赞用户列表)scard(获取点赞用户数)
sadd like:001 user1 user2 user3
srem like:001 user2
-- 点赞列表
smembers like:001
-- 点赞人数
scard like:001
-- 某人是否点赞
sismember like:001 user2
-- 交集
del key1 key2 key3
sadd key1 u1 u2 u3
sadd key2 u2 u3 u4
sadd key3 u3 u4 u5
sinter key1 key2
-- 并集
sunion key1 key2
-- 差集 key1减去key2 key3的并集
sdiff key1 key2 key3
-- 所有给定集合的交集存储到des1集合中
sinterstore des1 key1 key2
smembers des1
-- 所有给定集合的并集存储到des2集合中
sunionstore des2 key1 key2
smembers des2
-- 计算后的差集存储到des3集合中
sinterstore des3 key1 key2
smembers des3
-- 将member元素从source集合移动到des集合中 smove source des member
sadd des1 u1
smove des1 des3 u1
-- sscan key cursor [match pattern] [count] 迭代集合中的元素
sscan des1 2
有序集合Zset
-- zset,有序集合,类似set,但和set相比,SortedSet 增加了一个double类型的分数,使得集合中的元素能够按照分数进行有序排列。
-- 应用场景:排行榜,微信朋友圈步数排行榜,段位排行榜,话题热度排行榜
-- 相关命令:zincr(点击一次进行加一)zrerange(从大到小排序)zunionstore(多日搜索汇总)
-- 增加一个或多个成员,或者更新已存在成员的分数
-- zadd key score1 member1 score2 member2
zadd zkey 10000 user1 20000 user2
-- 获取集合元素个数
zcard zkey
-- zrem key [member...] 移除集合中的一个或多个成员
zrem zkey user2
-- 获取指定有序集合中指定元素的score值 zscore key member
zscore zkey user2
-- 分数加n zincrby key n member
zincrby zkey 2 user2
-- 按照分数区间返回数据,score从低到高 加上withscores 会返回分数
zrange zkey 0 50000
zrange zkey 0 50000 withscores
-- 按照分数区间返回数据,score从高到低 加上withscores 会返回分数
zrevrange zkey 0 50000
zrevrange zkey 0 50000 withscores
-- zunionstore final_key n zkey1 zkey1 多个榜单合并,n是合并的榜单数
zadd zkey1 10000 user1 20000 user2
zadd zkey2 10000 user3 20000 user2
zunionstore finalzkey 2 zkey1 zkey2
-- zunionstore 会把多个榜单中相同的key 的分数进行累加,key求并集
zrevrange finalzkey 0 100000 withscores
-- 获取指定元素索引 第一名是0
zrank key member
zrank zkey1 user2
-- 交集
-- zinterstore des numkeys [key...] 计算给定的一个或多个有序集合的交集并把结果存储在有序集合中,同样的,score会累加
zadd zkey3 10000 user1 20000 user2
zadd zkey4 10000 user3 30000 user2
zinterstore finalzkey2 2 zkey3 zkey4
zrange finalzkey2 0 100000 withscores
-- 差集
-- zdiff des numbers [key...] 计算给定的一个或多个集合的差集,并把结果存在新的key中
zadd zkey5 10000 user1 20000 user2
zadd zkey6 10000 user3 30000 user2
zdiffstore finalzkey3 2 zkey5 zkey6
zrange finalzkey3 0 100000 withscores
Bitmaps位图
-- 位图Bitmaps存储的是连续的二进制数字(0和1),通过Bitmap,只需要一个bit位来表示某个元素对应的值或者状态,key就是对应元素本身。我们知道8个bit可以组成一个byte,所以Bitmap本身会极大地节省存储空间。
-- 可以用于用户在线状态判断,每个用户对应一位,1表示在线,0表示离线
-- 签到系统,偏移量表示日期,1表示已签到,0表示未签到
-- 投票系统,位图可以用来记录投票情况,便于快速统计
-- 给指定key的值第offset赋值val 时间复杂度O(1)
-- setbit key offset val
setbit bitkey 3 1
setbit bitkey 1 0
-- 获取指定key的第offset位 时间复杂度O(1)
getbit bitkey 0
-- bitcount key start end 返回指定key中[start,end]中为1的数量时间复杂度O(n)
bitcount bitkey 0 1
-- bitpos key bit start end 查找字符串中第一个设置为1或0的位的位置
bitpos bitkey 0
HyperLogLog 超日志
-- 超日志(HyperLogLogs)
-- HyperLogLog是一种有名的基数计数概率算法,基于LogLog Counting(LLC)优化改进而来,并不是Redis特有的,Redis只是实现了这个算法并提供了一些开箱即用的API
-- Redis提供的HyperLogLog占用空间非常非常小,只需要12k的空间就能存储接近2^64个不同元素,并且Redis对HyperLogLog的存储结构做了优化,采用两种方式计数:
-- 稀疏矩阵:计数较少的时候,占用空间很小。
-- 稠密矩阵:计数达到某个阈值的时候,占用12k的空间
-- PFADD key element [element] 添加一个或多个元素到HyperLogLog中
pfadd name user1 user3
pfadd name1 user1 user2
-- PFCOUNT key [key...] 获取一个或多个HyperLogLog的唯一计数
pfcount name
pfcount name1
-- PFMERGE destkey sourcekey [sourcekey...] 将多个HyperLogLog合并到destkey中,destkey会结合多个源,算出对应的唯一计数,结果会去重
pfmerge final_name name name1
pfcount final_name
GEO地理空间索引
-- 地理空间(Geospatial)
-- GeoSpatial index(地理空间索引,简称GEO)主要用于存储地理空间信息,基于Sorted Set实现。
-- 通过Geo我们可以轻松实现两个位置距离的计算,获取指定位置附近的元素等功能。
-- GEOADD key longitude1 latitude1 member1 [...] 添加一个或多个元素对应的经纬度信息到GEO中
GEOADD city 113.3123 28.1213 changsha
GEOADD city 113.3123 28.1213 changsha 114.123123 30.1414 wuhan 11.41314 22.124 shenzhen 121.1241 23.124124 shanghai 91.123 29.12312 lasa
-- 获取给定元素的经纬度信息
GEOPOS city changsha
-- 计算两个点之间的距离 默认是米,加km自动换算成km
GEODIST city lasa changsha
GEODIST city lasa changsha km
-- 返回某个点附近多少距离的点(附近的人)
-- GEORADIUS key longitude latitude radius m|km|ft|mi withcoord(返回经纬度) withdist(返回距离) count(返回最近的几个) [asc|desc] store new_key(存储到新的key中)
-- 返回距离最近的3个
GEORADIUS city 112 28 5000 km withcoord withdist count 3 asc
-- 把最远的2个存到kk中
GEORADIUS city 112 28 5000 km count 2 desc store newky
GEORADIUS newky 112 28 5000 km
GEORADIUS newky 112 28 5000 km withcoord withdist count 3 asc
发布订阅模型
-- 发布/订阅(Pub/Sub)
-- Redis发布/订阅是一种消息传播模式,其中发布者发送消息,而订阅者接收消息,传递消息的通道称为channel
SUBSCRIBE new_user
-- 在一个新的客户端发送消息,执行上面了subscribe的客户端将收到消息
publish new_user user1
-- 简易的实时消息传递场景(无法持久化)
-- 聊天系统:用户发送的消息可以通过Redis的频道广播给所有订阅者,实现实时聊天功能。
-- 通知消息:例如在社交媒体平台上,当有新评论或新点赞时,可通过Pub/Sub通知相关用户

浙公网安备 33010602011771号