Redis基础
2022-08-19 10:24:59 0 举报
AI智能生成
Redis基础 Lua脚本,server,Stream,过期键清除策略,发布/订阅,事务,基本数据类型
作者其他创作
大纲/内容
执行 Lua 脚本
EVAL script numkeys key [key ...] arg [arg ...]
EVALSHA sha1 numkeys key [key ...] arg [arg ...]
查看指定的脚本是否已经被保存在缓存当中
SCRIPT EXISTS script [script ...]
从脚本缓存中移除所有脚本
SCRIPT FLUSH
杀死当前正在运行的 Lua 脚本
SCRIPT KILL
将脚本 script 添加到脚本缓存中,但并不立即执行这个脚本
SCRIPT LOAD script
基本命令
扣费转账
应用场景
Lua脚本在Redis中是以原子方式执行的
当Lua脚本遇到异常时,已经执行过的逻辑是不会回滚的。
https://segmentfault.com/a/1190000037518418
特性
Lua脚本
验证密码是否正确
AUTH password
打印字符串
ECHO message
查看服务是否运行
PING
关闭当前连接
QUIT
切换到指定的数据库
SELECT index
连接
强制清空所有数据库中的所有key(可添加async选项异步执行)
\tFLUSHALL[async]
清空当前数据库中的所有 key(可添加async选项异步执行)
FLUSHDB [async]
所有连接到服务器的客户端信息和统计数据
CLIENT LIST
CLIENT KILL 127.0.0.1:43501
关闭地址为 ip:port 的客户端
CLIENT KILL [ip:port] [ID client-id]
异步执行一个 AOF(AppendOnly File) 文件重写操作
BGREWRITEAOF
在后台异步保存当前数据库的数据到磁盘
BGSAVE
同步保存数据到硬盘
SAVE
修改 redis 配置参数,无需重启
CONFIG SET parameter value
获取指定配置参数的值
CONFIG GET parameter
返回当前数据库的 key 的数量
DBSIZE
获取 Redis 服务器的各种信息和统计数值
INFO [section]
用于复制功能(replication)的内部命令
SYNC
互换数据库
SWAPDB x y
以非阻塞方式在线替换数据库
server
设置key过期时间,以秒计
EXPIRE key seconds
设置key过期时间,以毫秒计
PEXPIRE key milliseconds
设置值同时设置过期时间(原子性)
SET key value [EX seconds] [PX milliseconds]
以某个时间点为过期时间,-秒, UNIX 时间戳;
EXPIREAT key timestamp
以某个时间点为过期时间,-毫秒, UNIX 时间戳;
PEXPIREAT key milliseconds_timestamp
TTL key
EXPIRE key seconds
验证码过期,自动淘汰冷门数据,带有自动释放特性的锁
登录会话
当读/写一个已经过期的key时,会触发惰性删除策略,直接删除掉这个过期的key
优点:避免主动删除导致redis有卡顿
缺点:如果key不在被访问,会一直占内存,相当于过期失效
被动删除
Redis定期主动淘汰一批已过期的key
针对设置了过期时间的键值对,根据过期时间的先后进行删除,越早过期的越先被删除
volatile-ttl
对设置了过期时间的键值对中,进行随机删除
volatile-random
使用LRU算法筛选设置了过期时间的键值对删除
volatile-lru
使用LFU算法筛选设置了过期时间的键值对删除
volatile-lfu
针对设置了过期时间的key做处理
从所有键值对中进行随机选择并删除数据
allkeys-random
使用LRU对所有数据进行筛选删除
allkeys-lru
使用LFU对所有数据进行筛选删除
allkeys-lfu
针对所有的key做处理
淘汰很久没有被访问过的数据,以最近一次访问时间作为参考
LRU
淘汰最近一段时间被访问次数最少的数据,以访问次数作为参考
热点数据适合用LFU
LFU
主动删除
只能对整个集合或者整个散列设置生存时间/过期时间,但是却无法为集合中的某个元素或者散列中的某个字段单独设置生存时间/过期时间
缺陷
过期键清除策略
Redis 命令参考:http://doc.redisfans.com/
测试地址:https://try.redis.io/
源码地址:https://github.com/redis/redis
Redis 官网:https://redis.io/
全拼( Remote DIctionary Server ) 通常被称为数据结构服务器
可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。
支持数据的持久化
提供list,set,zset,hash等数据结构
不仅仅支持简单的key-value类型的数据
master-slave模式的数据备份
支持数据的备份
特点
性能极高
丰富的数据类型
所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行
原子
丰富的特性
优势
推荐书籍:《Redis使用手册》
简介
值最大能存储 512MB
设置指定 key 的值
可选的NX选项或者XX选项来指示SET命令是否要覆盖一个已经存在的值
SET key value [NX|XX]
获取指定 key 的值
GET key
获取旧值并设置新值
GETSET key value
获取所有(一个或多个)给定 key 的值
MGET key1 [key2..]
同时设置一个或多个 key-value 对。
MSET key value [key value ...]
只在键不存在的情况下,一次为多个字符串键设置值
MSETNX key value [key value ...]
获取指定下标范围内的字符串
GETRANGE key start end
设置指定下表开始替换字符,有多长替换多长
SETRANGE key index substitute
只有在 key 不存在时设置 key 的值。
SETNX key value
相当于set + expire命令的组合
SETEX key seconds value
查询/赋值
字符串值长度
STRLEN key
追加字符串,返回长度
APPEND key value
将 key 中储存的数字值增 1
INCR key
为整数值加上指定的整数增量,并返回键在执行加法操作之后的值
INCRBY key increment
对数字值执行浮点数加法操作
INCRBYFLOAT key increment
将 key 中储存的数字值减一
DECR key
自减 指定数
DECRBY key decrement
以0为开始,从字符串的开头向结尾不断递增。
正数索引
以-1为开始,从字符串的结尾向开头不断递减。
负数索引
索引
使用C语言的long long int类型存储的整数,64位长度的有符号整数,取值范围介于-9223372036854775808和9223372036854775807之间
使用C语言的long double类型存储的浮点数,128位长度的有符号浮点数,取值范围介于3.36210314311209350626e-4932和1.18973149535723176502e+4932L之间
存储数字值
获取二进制中offset这个位置的“0,1”状态
GETBIT key offset
设置二进制中offset这个位置的“0,1”状态
SETBIT key offset value
二进制
redis中用SDS表示字符串
二进制安全的数据结构:C语言字符串以/0结尾,不能兼容其他语言的字符串类型
内存预分配机制,避免频繁的内存分配
SDS:Simple Dynamic String
存储8个字节的长整形
int
raw需要分配两次内存空间
存储大于44个字节的字符串
raw
只分配一次内存空间
embstr是只读的,如果修改value后就变成raw了
如果int数据不再是整数,会从int类型变成raw
存储小于等于44个字节的字符串
embstr
String的三种存储结构
SET key value
缓存
确保了代表锁的字符串键只会在没有值的情况下被设置
SET key value NX
释放锁
DEL key [key ...]
锁
文章长度计数
文章预览
追加日志
分布式发号器
计数器
限速器
String(字符串)
将哈希表 key 中的字段 field 的值设为 value
HSET key field value
同时将多个 field-value (域-值)对设置到哈希表 key 中
HMSET key field1 value1 [field2 value2 ]
只有在字段 field 不存在时,设置哈希表字段的值
HSETNX key field value
返回哈希表中指定字段的值
HGET key field
获取在哈希表中指定 key 的所有字段和值
HGETALL key
获取所有给定字段的值
HMGET key field1 [field2]
查看哈希表的指定字段是否存在,存在返回1,不存在返回0
HEXISTS key field
删除哈希表中的一个或多个指定字段,不存在的字段将被忽略。
HDEL key field1 [field2]
获取所有哈希表中的字段
HKEYS key
获取哈希表中所有值
HVALS key
对字段存储的整数值执行加法或减法操
HINCRBY hash field increment
获取哈希表中字段的数量
HLEN key
迭代哈希表中的键值对
HSCAN key cursor [MATCH pattern] [COUNT count]
获取字段值的字节长度
HSTRLEN hash field
ziplist是一个双向链表,但是不存preview和next指针,存的是上一个节点的长度和当前结点的长度
当hash中存储的field小于512个的时候,这时候用ziplist
hash中所有的field和value的字符串长度都小于64byte
ziplist
数组加链表
hash table
存储结构
短网址生成
用户登录会话
需要为每个数据项单独设置过期时间
需要对数据项执行诸如SETRANGE、GETRANGE或者APPEND等操作
优先考虑使用字符串键
程序需要存储的数据项比较多,并且你希望尽可能地减少存储数据所需的内存
多个数据项在逻辑上属于同一组或者同一类
优先考虑使用散列键
对比字符串和散列
Hash(哈希)
从队列的左边入队一个或多个元素
LPUSH key value1 [value2]
当队列存在时,从队左边入队一个元素
LPUSHX key value
从队列右边入队一个元素
RPUSH key value1 [value2]
从队列右边入队一个元素,仅队列存在时有效
\tRPUSHX key value
从队列左边出队一个元素
LPOP key
从队列右边出队一个元素
RPOP key
通过索引获取一个元素
LINDEX key index
在列表的元素前或者后插入元素
LINSERT list BEFORE|AFTER target_element new_element
获取列表长度
LLEN key
获取列表指定范围内的元素
LRANGE key start stop
从列表中删除元素
LREM key count value
根据下标设置队列元素值
LSET key index value
对一个列表进行修剪
LTRIM key start stop
将右端弹出的元素推入左端
RPOPLPUSH source target
移出并获取列表的第一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止
BLPOP key1 [key2 ] timeout
移出并获取列表的最后一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止
BRPOP key1 [key2 ] timeout
弹出一个列表值,将他插入到另一个列表中; 列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止
\tBRPOPLPUSH source destination timeout
quick list+zip list
LTRIM
取最新N个评论
第一种实现
RPUSH key value1 [value2]
LPOP key
第二种实现
先进先出队列
先进后出栈
LRANGE
分页
LPUSH key value1 [value2]
待办事项列表
BLPOP key1 [key2 ] timeout
带有阻塞功能的消息队列
List(列表)
添加一个或多个元素到集合中
SADD key member1 [member2]
获取集合中元素数量
SCARD key
获取集合中所有元素
SMEMBERS key
判断 member 元素是否是集合 key 的成员
SISMEMBER key member
将 member 元素从 source 集合移动到 destination 集合
SMOVE source destination member
随机地从集合中移除指定数量的元素
SPOP key [count]
随机获取一个或多个元素
SRANDMEMBER key[count]
集合里删除一个或多个元素
SREM key member [member2]
迭代集合中的元素
SSCAN key cursor [MATCH pattern] [COUNT count]
返回给定所有集合的交集
SINTER key1 [key2]
返回给定所有集合的交集并存储在 destination 中,如果给定的键已经存在,那么SINTERSTORE命令在执行存储操作之前会先删除已有的键。
SINTERSTORE destination key1 [key2]
返回所有给定集合的并集
SUNION key[key...]
所有给定集合的并集存储在 destination 集合中,在键已经存在的情况下自动覆盖已有的键
SUNIONSTORE DESTINATION KEY[KEY ...]
返回第一个集合与其他集合之间的差异
SDIFF key1 [key2]
返回给定所有集合的差集并存储在 destination 中
SDIFFSTORE destination key1 [key2]
intset
hashtable
抽完不能参加下一轮
SPOP key [count]
抽完不会移除
SRANDMEMBER key[count]
抽奖
SINTER key1 [key2]
SDIFF key1 [key2]
对账
共同关注
SUNION key[key...]
推荐关注
SADD key member1 [member2]
SCARD key
网站用户数量
SMEMBERS key
SISMEMBER
SREM key member [member2]
SCARD
打标签、社交关注、点赞、投票
反向索引构建商品筛选器
列表可以存储重复元素,而集合只会存储非重复元素
列表以有序方式存储元素,而集合则以无序方式存储元素
新增和删除元素复杂度低
集合和列表区别
Set(集合)
向有序集合添加一个或多个成员,或者更新已存在成员的分数
ZADD key score1 member1 [score2 member2]
获取有序集合的成员数
ZCARD key
计算在有序集合中指定区间分数的成员数
ZCOUNT key min max
有序集合中对指定成员的分数加上增量 increment
ZINCRBY key increment member
在有序集合中计算指定字典区间内成员数量
ZLEXCOUNT key min max
通过索引区间返回有序集合指定区间内的成员
ZRANGE key start stop [WITHSCORES]
返回有序集中指定区间内的成员,通过索引,分数从高到低
ZREVRANGE key start stop [WITHSCORES]
通过字典区间返回有序集合的成员
ZRANGEBYLEX key min max [LIMIT offset count]
返回有序集合中指定成员的索引
ZRANK key member
返回成员的降序排列索引
ZREVRANK key member
移除有序集合中的一个或多个成员
ZREM key member [member ...]
移除有序集合中给定的字典区间的所有成员
ZREMRANGEBYLEX key min max
移除有序集合中给定的排名区间的所有成员
ZREMRANGEBYRANK key start stop
返回有序集中,成员的分数值
ZSCORE key member
通过分数返回有序集合指定区间内的成员
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT]
返回有序集中指定分数区间内的成员,分数从高到低排序
ZREVRANGEBYSCORE key max min [WITHSCORES]
移除有序集合中给定的分数区间的所有成员
ZREMRANGEBYSCORE key min max
计算给定的一个或多个有序集的并集,并存储在新的 key 中
ZUNIONSTORE destination numkeys key [key ...]
计算给定的一个或多个有序集的交集并将结果集存储在新的有序集合 destination 中
ZINTERSTORE destination numkeys key [key ...]
迭代有序集合中的元素(包括元素成员和元素分值)
ZSCAN key cursor [MATCH pattern] [COUNT count]
skip list
ZINCRBY key increment member
ZREVRANK key member
ZREVRANGE key start stop [WITHSCORES]
带有权重的元素或热搜排行
ZREVRANGEBYSCORE key max min [WITHSCORES]
时间线
Sorted Set(有序集合)
基本数据类型
keys n?me
keys n*me
keys n[]me
keys n\\?me
模式匹配
redis中key全部是以String类型来处理
KEYS pattern
判断指定的key是否存在,存在返回 1 不存在返回 0
EXISTS key
删除key,返回删除的数量
DEL key
以异步方式移除指定的键
UNLINK key [key ...]
返回 key 所储存的值的类型
TYPE key
返回一个随机key
RANDOMKEY
修改 key 的名称
RENAME key newkey
移除 key 的过期时间,key 将持久保持
PERSIST key
将当前数据库的 key 移动到给定的数据库 db 当中
MOVE key db
迭代数据库中的数据库键
SCAN cursor [MATCH pattern] [COUNT count]
对键的值进行排序
SORT key
获取数据库包含的键值对数量
查看键的类型
TYPE key
SET key
KEY
将信息发送到指定的频道
PUBLISH channel message
订阅给定的一个或多个频道的信息
\tSUBSCRIBE channel [channel ...]
退订频道
UNSUBSCRIBE [channel channel ...]
查看订阅与发布系统状态
\tPUBSUB subcommand [argument [argument ...]]
\tPSUBSCRIBE pattern [pattern ...]
退订所有给定模式的频道
\tPUNSUBSCRIBE [pattern [pattern ...]]
轻量级消息中间件
广播系统
发布/订阅
标记一个事务块的开始
MULTI
事务结束,执行所有事务块内的命令
\tEXEC
取消事务,放弃执行事务块内的所有命令
DISCARD
监视key变化,发生变化时会取消事务
WATCH key [key ...]
取消 WATCH 命令对所有 key 的监视
UNWATCH
批量操作
拒绝执行这个事务
入队错误
服务器也不会中断事务的执行,它会继续执行事务中余下的其他命令
无回滚方式来处理事务
执行错误
错误处理
单个 Redis 命令的执行是原子性的,但 Redis 没有在事务上增加任何维持原子性的机制,所以 Redis 事务的执行并不是原子性的
watch指令,类似乐观锁,事务提交时,如果 key 的值已被别的客户端改变,比如某个 list 已被别的客户端push/pop 过了,整个事务队列都不会被执行
https://segmentfault.com/a/1190000023951592
Transaction(事务)
Redis基础
0 条评论
回复 删除
下一页