redis
redis cli
redis 命令
所有 key
keys *
删除某个key
del ***
del key
清空所有 数据
flashall
业务场景
自增id
postID = incr posts.count
可以使用 get posts.count 获取
设置文章
set post:1:data "文章内容"
增加指定的整数
incrby
incrby bar 2
减少指定的整数
decr
decr bar
减少指定的整数
decrby bar 2
增加指定的浮点数
incrbyfloat bar 2.7
追加
set name bob
append name bit
获取 字符串长度
strlen name
get name
打印 bobbit
同时设置多个值
mset name bob age 2
get age
同时获取多个值
mget name age
散列类型
hset
赋值
hset car price 500
取值
hget car price
多个赋值
hmset car price 500 name bmw
多个取值
hmget car price name
hset 命令 不区分插入和更新 修改数据 不用判断是否存在 决定要执行 是插入还是更新
当执行 插入 之前字段不存在 命令返回1 当执行更新 之前字段存在命令返回0 当键本身不存在
hset 命令 自动创建
hgetall 获取所有的键值
hexists key field
如果存在 返回1 否则 0
hsetnx key field value 如果字段存在 将不执行操作
增加数字
hincrby key field increment
删除字段
hdel car price
一篇文章的 redis 结构
post:42 title 第一篇日志
post:42 author 小白
post:42 time 2012年9月11日
post:42 content 今天是星期5...
文章缩略名 与 id 映射 便于 获取文章id
postid = incr posts:count
hsetnx 判断 id 缩略名 文章id
如果 设置成功 返回1 如果字段已存在返回 0失败
获取所有key
hkeys key
获取所有values
hvals key
获取字段数量
hlen key
列表
常用的操作是两端添加元素或者获得列表的某一个片段
内部是双向链表 获取越接近两端元素就越快
## 豆包开始
Redis 链表(List)的获取和插入操作主要通过以下命令实现:
一、插入操作
头部插入
LPUSH key value [value...]:在链表头部插入一个或多个元素
LPUSHX key value:仅当键存在时执行头部插入
尾部插入
RPUSH key value [value...]:在链表尾部插入一个或多个元素
RPUSHX key value:仅当键存在时执行尾部插入
指定位置插入
LINSERT key BEFORE|AFTER pivot value:在指定元素前/后插入新元素
二、获取操作
范围查询
LRANGE key start stop:获取指定索引范围的元素(支持负数索引)
单元素查询
LINDEX key index:通过索引获取单个元素
长度查询
LLEN key:获取链表长度
三、底层实现特性
采用双向链表结构,节点包含前驱/后继指针
头部/尾部操作时间复杂度为O(1),中间操作需遍历链表
支持存储任意数据类型(节点值为void*指针)
示例操作流程:
text
Copy Code
127.0.0.1:6379> LPUSH mylist A B C # 头部插入
(integer) 3
127.0.0.1:6379> LRANGE mylist 0 -1 # 获取全部元素
1) "C"
2) "B"
3) "A"
127.0.0.1:6379> LINSERT mylist BEFORE B X # 指定位置插入
(integer) 4
##豆包结束
list
向左添加
lpush key value [value ...]
向右添加
rpush key value [value ...]
lpush num 1
rpush num 2 3
弹出数据
弹出后元素从列表移除 返回被移除的元素值
左弹出数据
lpop key
右弹出数据
rpop key
获取列表中元素个数
llen key
获取列表片段 起始索引为0
lrange key start stop
lrange key 0 2
打印 2 1 0
支持负数索引
lrnage number -2 -1
-1 标识 最右边的第一个 元素 -2 最右的第二元素
lrange number 0 -1 取左边起始索引0 到最右边 第一个元素 也就是 获取所有元素
start 索引位置 stop 索引靠后 返回空列表
stop 超出索引范围 返回到列表最右元素
删除列表中的指定的值
lrem key count value
存储文章的id 列表
将文章id 存储到list中
lpush post:list 1
lrange post:list 0 100
获取到 前100条 id 集合 循环id集合
获取 所有 文章 标题 作者 内容 时间
hgetall post:id
使用 列表 存储id 存在一个问题 需要用 修改时间进行排序 id 这里办不到
可以用于存储 文章的评论 lpush post:42:comments "写的不错"
获取或者设置指定的索引值
lindex key index
设置索引值
lset key index value
获取索引值
lindex number 0
lindex number -1
集合类型
内部使用值为空的散列表 实现 可以进行 交集 并集 差集
Redis 无序集合(Set)的获取和插入操作主要通过以下命令实现:
##豆包
一、插入操作
单元素/批量插入
SADD key member [member...]:向集合添加一个或多个元素,自动去重
若键不存在会自动创建新集合
移动元素
SMOVE source destination member:将元素从一个集合移动到另一个
二、获取操作
全量获取
SMEMBERS key:返回集合所有元素(无序)
条件查询
SISMEMBER key member:检查元素是否存在(返回1/0)
SCARD key:获取集合元素数量
随机获取
SPOP key [count]:随机移除并返回元素
SRANDMEMBER key [count]:仅随机返回不删除
三、特性说明
底层采用哈希表实现,操作复杂度为O(1)
元素唯一且无序,支持存储字符串/数字等类型
最大可存储2^32-1个元素
示例操作:
text
Copy Code
127.0.0.1:6379> SADD fruits apple banana orange
(integer) 3
127.0.0.1:6379> SMEMBERS fruits # 可能返回任意顺序
1) "banana"
2) "orange"
3) "apple"
127.0.0.1:6379> SISMEMBER fruits apple
(integer) 1
## 豆包结束
增加元素
sadd key member [member..]
删除元素
srem key member [member...]
获得集合中所有元素
smembers key
判断元素是否在集合中
sismembers key member
集合间的运算
差集
sdiff key [key..]
交集
sinter key [key..]
并集
sunion key [key...]
给文章添加标签
sadd post:42:tags 技术文章 闲言碎语 java
删除标签
srem post:42:tags 闲言碎语
显示所有的标签
smembers post:42:tags
正向 存储
sadd post:1:tags java
sadd post:2:tags java mysql
sadd post:3:tags java mysql redis
反向
sadd tag:redis:post 3
sadd tag:mysql:post 2 3
sadd tag:java:post 1 2 3
获取集合元素个数
scard letters
有序集合
使用散列表和跳跃表 实现
zadd key score membre [score member ...]
zadd scoreboard 89 tom 67 peter
获取元素分数
zscore key member
zscore scoreboard tom
获取排名在某个范围元素列表
zrange key start top [winthscore]
zreverange key start top [winthscore]
下面 0 2 都是索引
zrange scoreboard 0 2
如果两个数相同是按字典顺序排列
获取获得指定范围的元素
zrangebyscore scoreboard 80 100
zrangebyscore scoreboard 80 100 limit 1 3
反转获取前三个
zreverangebycore scoreboard 100 0 limit 0 3
增加某个元素分数
zincrby scoreboard 4 jerry
将文章id作为元素 点击量作为分数
最大的点击量拍前面
zreverange post:page.view 1 10
利用时间排序
将文章id作为元素 发布时间 存到分数中
获取集合中元素数量
zcard key
zcard scoreboard
获取指定分数范围的元素个数
zcount key min max
zcount scoreboard 90 100
删除一个或者多个元素
zrem key member [member ...]
zrem scoreboard wend
按照排名范围删除元素
zremrangebyrank key start stop
获得元素排名
从小到大排序
zrank key member
从大大小
zrevrank key member
事务
redis 事务没有回滚
如果语法错误 一条 命令也不执行 正确的命令也不会执行
如果是运行错误 正确的命令会执行 错误的不会执行
multi
sadd user:1:following 2
sadd user:1:followers 1
exec
生存周期
set session:1 abc
设置过期时间 返回1成功
expire session:1 900
删除
del session:1
set foo bar
expire bar 200
使用ttl 获取还有多久时间会被删除
ttl bar
取消键的生命周期
persist bar
限流
rate.limiting:1
sort 命令
有序集合
sort tag:ruby:posts
对列表 排序
lpush mylist 1 2 5 7
sort mylist
对于有序集合排序 只排序 值不排序 分数
获取2个
sort tag:ruby:post desc limit 1 2
使用 by 参考键 排序
对每个元素使用元素的值替换参考键中的第一个 * 获取其值 然后根据该值 对元素排序
sort tag:ruby:posts by post:*->time desc
打印
12
3
4
sort 命令会读取 post:2 post:6 post:12 几个散列键中的time字段值比较决定 各个文章id的顺序
除了散列类型参考键还可以是字符串类型
sort tag:ruby:posts by post:*->time desc get post:*->title
如果希望 排序后 保存 排序后的结果 用store
sort tag:ruby:posts by post:*->time desc get post:*->title get # store sort.result
消息通知
发布/订阅
publish channel message
发送消息
publish channel1.1 hi
接收消息
subscribe channel [channel..]
订阅消息
subscribe channel1.1
取消订阅
unsubscribe [channel...]
管道
当一组命令中每条命令都不依赖于之前的命令的执行结果时就可以将这组命令一起通过管道发出
管道通过减少客户端与redis 的通信次数来实现降低往返时延累计值的目的