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