基础
数据库演进历史
mysql单库 -> Memcached(缓存)+MYSQL+垂直划分(读写分离<主从>) -> 分库分表+水平划分+MYSQL集群
数据量大 读写混合
Redis(remote dictionary server)
键值数据库(key,value可以是一个json字符串)
单线程,保证命令原子性 —高性能原因主要是基于内存,IO多路复用是次要
支持数据持久化(rdb aof)
支持主从集群–保证数据安全,从为数据备份 分片集群—分布式存储
generic
keys [pattern] Find all keys matching the given pattern
del [key…] 删除
exists [key] 是否存在
expire [key] [seconds] 设置过期时间 -1为永久有效
ttl [key] 查看剩余时间
flushall 清空所有库
fulshdb 清空当前库
type [key] 查看类型
rename key newkey
String
set key value 增加或修改
mset [key value …] 增加或修改多组
get key 获取
mget [key…] 获取多组
incr key key对应数字加1
incrby key value key对应数字加value
incrbyfloat key v key对应浮点数加v
setnx key value 新增(已经有不做操作) =set key value nx
setex key seconds value 指定过期时间的set == set key value ex seconds
append key “…” 在原本的value后面增加
getrange key start end ==substring [start,end]
setrange key offset “” replace
getset key value 先获取在修改值没有则为nil
Key 的层级
…:…:1
Hash类型 key-Map集合
Hset key field value(hset why:1 age 10)
hget key field
hmset
hmget
hdel key field 删除hash指定的key字段
hl en key 查看有多少个字段
hgetall key 类似于Java entrySet
hkeys key 获取所有field Java getKeys
hvals key 获取所有value getValues
hincrby key field value 一个hash类型字段值自增
hsetnx 添加
List类型 双端队列/链表
lpush key element[…] 左侧插入
lpop key 返回移除左侧第一个元素,没有就返回nil
rpush key element[…]
rpop key
lrange key start end 返回一段角标范围内的所有元素
ltrim key start end 截取下标,list改变为截取值
//blpop brpop 和上面类似都是没有元素时等待
lindex key index 获取list的index下标的值(起始为0)
lset key index item 在key下index下标存在时,更新下标值
linsert key after|before 原字段 value 在原字段前或后插入字段
rpoplpuch list1 list2 将list1中最右值插入list2最左边
Set 类似HashSet
sadd key member…
srem key member…
scard key 返回元素个数
smemvers key 返回key下set的所有元素
sismember key member 判断member是否在key中
sinter k1 k2
sdiff k1 k2
sunion k1 k2
srandmember key 随机抽取set中的一个值
spop key count 随机删除count个元素
SortedSet 需要一个score进行排序
zadd key [score member… ]
zrem key member…
zscore key member 获取score
zrank key member 获取指定元素排名
zcard key 获取元素个数
zcount key min max score在给定范围内的元素个数
zincrby key increment
zrangebyscore key min max [withscores] 从最小值到最大值排序
zrevrange key star end [withscores] 降序排列(ZREVRANGE salary 0 -1 withscores)排名
127.0.0.1:6379> ZREVRANGE salary 0 3
1) "zs"
2) "xh"
3) "zzz"
127.0.0.1:6379> ZREVRANGE salary 0 2
1) "zs"
2) "xh"
3) "zzz"
127.0.0.1:6379> ZREVRANGE salary 0 1
1) "zs"
2) "xh"
127.0.0.1:6379> ZREVRANGE salary 0 0
1) "zs"
三种特殊类型 Geospatial Hyperloglog Bitmap
见文档https://redis.io/docs/latest/commands/?group=bitmap
Geospatial 存储位置信息
Hyperloglog 以12k固定大小确定基数 可以统计唯一量
Bitmap 则可以做两种情况的东西,比如打卡之类
事务
redis 单条命令保持原子性 事务不保证原子性 事务没有隔离级别的概念
开启事务 multi
取消事务 discard
执行事务 exec
当语法错误时 类似java的编译时异常 都不执行
当有无法执行的命令时 类似java的运行时异常 执行没有错误的项 故redis事务不保证原子性
watch 可以实现乐观锁
127.0.0.1:6379> set money 100
OK
127.0.0.1:6379> set out 0
OK
127.0.0.1:6379> watch money
OK
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379(TX)> set money 10
QUEUED
127.0.0.1:6379(TX)> set out 10
QUEUED
127.0.0.1:6379(TX)> exec
(nil)
127.0.0.1:6379> unwatch
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379(TX)> INCRBY money -10
QUEUED
127.0.0.1:6379(TX)> INCRBY out 10
QUEUED
127.0.0.1:6379(TX)> EXEC
1) (integer) 70
2) (integer) 30
127.0.0.1:6379>
对象处理
存对象一般使用Json,如果必须要直接存对象,对象的类需要实现序列化
@Test
public void test() throws JsonProcessingException {
User user = new User("www", 12);
//String string = new ObjectMapper().writeValueAsString(user);
template.opsForValue().set("user",user);
System.out.println(template.opsForValue().get("user"));
}
进阶
配置文件解读
rdb(Redis DataBase)
rdb文件存放地址查看以及修改
配置文件中的./为运行redis的地址
config get dir
config set dir ...
触发机制
1.save条件满足
2.执行flushall
3.退出redis
优点:
1.适合大规模数据恢复
2.适合对数据完整性不高的情况,原因为缺点1
缺点
需要一定时间间隔进行操作,如果宕机最后一次修改数据会丢失
创建子进程占用一定内存空间
AOF(Append Only File)
默认关闭
主从复制(伪集群)
cp redis.conf …
修改 port pidfile logfile rbdfilename
查看状态 info replication
配置集群 slaveof localhost 6379 仅为单次配置,需要修改配置文件
主机写,从机只读
手动修改从机为主机 slaveof no one
哨兵模式
主机故障了自动选举主机 ,主机重启只能当作从机
最基本配置
vim sentiel.conf
# sentiel monitor 被监控的名字 host port 票数(与选举有关)
sentinel monitor myredis 127.0.0.1 6379 1
一些常见问题的介绍
缓存穿透
redis中和RDB中都没有导致过量访问RDB
缓存击穿
redis中热点数据过期导致过量访问该数据的访问RDB
雪崩
故障了自动选举主机 ,主机重启只能当作从机
[外链图片转存中…(img-muzLzwpB-1722215064444)]
最基本配置
vim sentiel.conf
# sentiel monitor 被监控的名字 host port 票数(与选举有关)
sentinel monitor myredis 127.0.0.1 6379 1
一些常见问题的介绍
缓存穿透
redis中和RDB中都没有导致过量访问RDB
缓存击穿
redis中热点数据过期导致过量访问该数据的访问RDB
雪崩
大量数据短时间内一起过期