最近在系统学习redis,从基础到进阶,学习随笔。
常用配置 redis.conf
daemonize yes/no 后台启动
port 端口
bind 绑定主机地址
databases 默认16个库 0-15
save 快照持久化,多少s内有多少变化,就持久化一次
dbfilename 快照持久化文件名称
dir 快照持久化文件目录
slaveof 指定当前节点为slave时,设置master信息
requirepass 设置密码操作
maxmemory 最大内存占用
appendonly aof持久化,是否进行日志记录
appendfilename aof持久化文件名称
常用命令
keys * 查看所有key
exists key 存在返回1,否则0
expire key seconds
ttl 查看剩余过期时间(s)
pttl 查看剩余过期时间(ms)
del 删除key
persist key 设置永不过期
pexrpre key milliseconds 修改key过期时间
select 选择数据库(0-15)多个数据库为了数据安全和备份
move key dbindex 将当前数据库的key
rename key key2 重命名key
type key 返回val的类型
dbsize 查看数据库key数量
info 查看数据库信息
flushdb 清空当前数据库
flushall 清空所有数据库
set key1 val1 expire key1 10(s) 等价于 setex key1 10(s) val1
设置了过期时间,可以使用 persist key 来永不过期
常用数据类型
string (字符串,数字)
常用命令:
set key value
setnx key value(key不存在,成功返回1,否则失败返回0)
setrange key offset val(替换字符串)
mset k1 v1 k2 v2 批量设置
mget k1 k2 批量查询
get key
getrange key start end (超出返回全部/空字符串)
getset key newVal (设置新值,返回旧值,不存在返回nil)
strlen key 返回长度,无返回0
del key
incr/decr key 自增/自减,val必须是数字类型,否则报错,无则先赋值0
incrby/decrby key offset 按步长自增/自减
append key val 将val追加到旧值上,无则先赋值空字符串
适用场景:
保存单个字符串或json字符串
String是二进制安全,适用可以把图片文件的内容作为字符串保存
计数器(粉丝数等),自增自减操作具有原子性
hash
常用命令:
hset key field value
hset user:1 name jmh
hmset key f1 v1 f2 v2
hsetnx key field value 只在field不存在时设置
hincrby key field increment 指定整数field自增步长
hincrbyfloat key field increment 指定浮点数field自增步长
hexists key field 查看是否存在该field
hget key field
hmget key f1 [f2]
hgetall key 返回所有field和val
hdel key f1 f2
hkeys key 返回field
hlen key 返回field的个数
适用场景:
常用于存储一个对象
list (双链表结构,对应java中的LinkedList)
常用命令
lpush key v1 v2 将一个/多个值头插法
rpush key v1 v2 将一个/多个值从右侧添加
lpushx key val 将一个值插入到列表头部,如果列表不存在,则失败
lpushx key val 将一个值插入到列表尾部,如果列表不存在,则失败
llen key 获取列表长度
lindex key index 通过索引获取列表元素,超出返回nil
lrange key start stop 获取指定范围的元素
也可以使用负数,-1表示最后一个,-2表示倒数第二个
lpop key 移除并获取列表第一个元素
rpop key 移除并获取列表最后一个元素
blpop k1 k2 timeout 移除并获取列表第一个元素,如果没有就阻塞等待到有或到达超时时间
如果有多个key,只返回满足条件的第一个key
brpop k1 k2 timeout 移除并获取列表最后一个元素,如果没有就阻塞等待到有或到达超时时间
ltrim key start stop 只保留列表指定范围内的值
lset key index value 通过索引修改值
linsert key BEFORE | AFTER world value 将value插入到列表的world前/后
rpoplpush source destination 移除列表最后一个元素,并将该元素添加到另一个列表并返回
rpoplpush k1 k2 将k1的最后元素放到k2的左侧
rpoplpush k1 k1 将k1的最后元素放到最前面
brpoplpush source destination timeout 从列表弹出一个值,将弹出的元素插入到另一个列表并返回它,如果列表没有元素则阻塞至可弹出或超时
应用场景
对数据量大的集合进行删减
关注列表、粉丝列表、留言评价、热点(top10)
利用lrange还可以分页
任务队列
set (类似java中hashtable)
常用命令
sadd key v1 v2 向集合中添加多个1值
scard key 获取集合长度
smembers 返回集合中的所有成员
sismember key member 判断member元素是否是key的成员
srandmember key [count] 返回集合中的一个或多个随机数
srem key v1 v2 删除集合中一个/多个值
spop key [count] 移除并返回集合中的一个随机元素
smove source destination member 将member从source移动到destination
sdiff k1 [k2] 返回给定所有集合1的差集(最左侧包含,但是其他不包含的)
sdiffstore destination k1 [k2] 返回给定所有集合的差集,并存在dest中,若dest不存在,会自动创建
sinter k1 [k2] 返回所有集合的交集
sinterstore destination k1 [k2] 返回所有交集,存在dest中
sunion k1 [k2] 返回所有集合的并集
sunionstore dest k1 k2 将所有并集存在dest中
应用场景:
对两个集合间数据进行交集、并集、差集运算(共同好友,关注等)
利用唯一性,同级访问网站的独立IP,活跃用户等
zset
操作指令都是z开头,所以有序集合通常叫做zset
每个值会关联一个double类型的分数score,根据分数进行排序
成员惟一,但是分数可以重复
常用命令:
zadd k1 score1 v1 [score2 v2] 添加
zcard key 获取成员数
zcount key min max 计算有序集合中指定区间分数的成员数
zrank key member 返回有序集合中指定成员的索引
zrange key start end [withscores] 通过索引区间返回集合指定区间内的成员(低到高)
zrangebyscore key min max [withscores] [limit] 通过分数返回集合指定区间的成员
zrevrange key start end [withscores] 返回集合指定区间内的成员,通过索引,分数由高到低
zrevrangebyscore key max min [withscores] 返回集合指定分数区间内的成员,分数有高到低
del key 移除集合
zrem key v1 v2 移除集合中一个或多个成员
zremrangebyrank key start end 移除给定的下标区间的所有成员,从0开始,由低到高
zremrangebyscore key min max 移除给定的分数区间的所有成员
zincrby key increment member 增加member 元素的分化increment,返回更改后的分数
应用场景:
排行榜
分数为时间 取出的就是按时间排序的
带权重的队列
redis 淘汰策略6种(最新加了2种)
设置了过期时间/所有 key里面 随机
设置了过期时间/所有 key里面 最近最少使用
报错、设置了过期时间的最快要过期的
设置了过期时间/所有 key里面 使用频率最少的
redis 原子性
多个操作支持事务,用MULTI和EXEC指令包起来