Redis
# Redis数据类型及操作
# keys
keys * 查看当前库所有 key
exists key 判断某个 key 是否存在
type key 查看你的 key 是什么类型
del key 删除指定的 key 数据
unlink key 根据 value 选择非阻塞删除,仅将 keys 从 keyspace 元数据中删除,后续自动清理。
expire key 10 10 秒钟:为给定的 key 设置过期时间
ttl key 查看还有多少秒过期,-1 表示永不过期,-2 表示已过期
select 命令切换数据库
dbsize 查看当前数据库的 key 的数量
flushdb 清空当前库
flushall 通杀全部库
# ►String
key=>Value 结构, 值最大512M
set KEY VALUE [EX|PX] [NX|XX]
NX :当数据库中 key 不存在时,可以将 key-value 添加数据库
XX :当数据库中 key 存在时,可以将 key-value 添加数据库,与 NX 参数互斥
EX :key 的超时秒数
PX :key 的超时毫秒数,与 EX 互斥
get KEY 查询对应键值
append KEY VALUE将给定的value 追加到原值的末尾 strlen key获得值的长度
setnx KEY VALUE只有在 key 不存在时 设置 key 的值
incr KEY将 key 中储存的数字值增 1
decr KEY将 key 中储存的数字值减 1
incrby / decrby KEY STEP 将 key 中储存的数字值增减
mset key1 val1 key2 val2 同时设置多个值
setex KEY TIME VALUE 设置键值的同时,设置过期时间,单位秒
# ►list
key=>values list, 单键多值,底层双向链表。
lpush/rpush key value1 value2 value3 .... 从左边/右边插入一个或多个值
lpop/rpop key 从左边/右边吐出一个值。值在键在,值光键亡
rpoplpush key1 key2 从key1列表右边吐出一个值,插到key2列表左边
lrange key start stop 按照索引下标获得元素(从左到右)
lindex key index按照索引下标获得元素(从左到右)
llen key获得列表长度
linsert key before value newvalue在value的后面插入newvalue插入值
lrem key n value从左边删除 n 个 value(从左到右)
lset key index value将列表 key 下标为 index 的值替换成 value
# ►set
Redis 的 Set 是 string 类型的无序集合。它底层其实是一个 value 为 null 的 hash 表,所 以添加,删除,查找的复杂度都是 O(1) .
sadd key value1 value2 ..... 将一个或多个 member 元素加入到集合 key 中,已经存在的 member 元素将被忽略 smembers key取出该集合的所有值
sismember key value 判断集合 key 是否为含有该value 值,有 1,没有 0
scard key 返回该集合的元素个数
srem key val1 val2... 删除集合中的某个元素
spop key 随机从该集合中吐出一个值
srandmember key n 随机从该集合中取出 n 个值。不会从集合中删除
smove source destination value 把集合中一个值从一个集合移动到另一个集合
sinter key1 key2返回两个集合的交集元素
sunion key1 key2返回两个集合的并集元素
sdiff key1 key2 返回两个集合的差集元素(key1 中的,不包含 key2 中的)
# ►Hash
Redis hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象。
hset key field value给key集合中的 field键赋值value
hget key1 field从key1集合field取出 value
hmset key1 field1 value1 field2 value2... 批量设置 hash 的值
hexists key1 field查看哈希表 key 中,给定域 field 是否存在
hkeys key列出该 hash 集合的所有 field
hvals key列出该 hash 集合的所有 value
hincrby key field increment为哈希表 key 中的域 field 的值加上增量 1 -1
hsetnx key field value将哈希表 key 中的域 field 的值设置为 value ,当且仅当域 field 不存在
# ►sorted set
zadd key score1 value1 score2 value2...
将 member 元素及其 score 值加入到有序集 key 当中
zrange key start stop [WITHSCORES]
返回有序集 key 中,下标在start stop之间的元素,带 WITHSCORES,可以让分数一起和值返回
zrangebyscore key minmax [withscores] [limit offset count]
返回有序集 key 中,所有 score 值介于 min 和 max 之间(包括等于 min 或 max )的成员。 有序集成员按 score 值递增(从小到大)次序排列。
zrevrangebyscore key maxmin [withscores] [limit offset count] 同上,改为从大到小排列。
zincrby key increment value 为元素的 score 加上增量 zrem key value删除该集合下,指定值的元素
zcount key min max 统计集合分数区间内的元素个数
zrank key value返回该值在集合中的排名,从 0 开始
# bitmaps
实际上就是字符串,但是可以对位进行操作。
setbit key offset value 设置某个偏移量的值为0或1
getbit key offset 获得某个偏移量的值
如可以使用 bitmaps 来记录用户某天是否登陆,使用这样的数据:setbit unique:users:20240212 8 1 来表示 id=8 的用户在这一天登录了
bitcount key [start end] 统计1的个数
bitop operation destkey key [key] 位操作key,保存结果到destkey中
# hyperloglog
求集合中不重复元素个数
Redis HyperLogLog 是用来做基数统计的算法,HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定的、并且是很小 的。
但是,因为 HyperLogLog 只会根据输入元素来计算基数,而不会储存输入元素 本身,所以 HyperLogLog 不能像集合那样,返回输入的各个元素。
pfadd key element [element] 添加
pfcount key [key] 计算近似基数
pfmerge destkey key [key] 合并HLL存储在destkey中
# geospatial
地理坐标计算
geoadd key longitude latitude member key是一系列坐标的名称,member是该点的名称
geopos key member 获得指定member的坐标
geodist key member1 member2 [m|km] 计算两个点的距离
georadius key longitude latitude radius m|km 从给定的中心点,找出给定的半径内的坐标点
# Redis的持久化
将Redis内存中的数据同步到硬盘中,有 RDB和AOF两种方式。
# RDB方式
RDB 是 Redis Database的缩写,是Redis定时持久化策略。触发时,父进程fork出一个子进程将内存中的数据写到临时文件中,完成后替换原来的RDB文件。 配置RDB文件的位置以及触发条件:
dir /DIT/TO/RDB # 默认为redis启动目录
dbfilename dump.rdb
save 3600 2 # 3600后至少有2个key发生变更才持久化
2
3
因为RDB的持久化条件,所以最后的数据是因为来不及持久化而丢失的。
# AOF方式
AOF是 Append Only File 的缩写,以日志的形式来记录写操作,恢复数据时Redis会读取重构数据。 当Redis接受到写操作时,会先放入 AOF缓冲区内,缓冲区根据t同步策略持久化到硬盘中。当AOF文件大小超过重写配置大小,会对AOF文件进行压缩。 配置AOF打开(默认关闭):
appendonly yes
appendfsync always #每次操作都同步
appendfsync everysec # 每秒同步
appendfsync no ## 交给操作系统
2
3
4
# 几种缓存问题
# 缓存击穿
(击穿是动词)缓存击穿是连续访问都无法命中缓存,直接访问数据库导致负载变高。如查询不存在的ID操作。可以使用对空值缓存、bitmaps白名单等方式解决。
# 缓存穿透
(穿透是形容词)缓存穿透是缓存存在,但是在key过期的瞬间涌入大量请求,直接访问数据库导致负载变高。即热点数据的实效问题。可以采用提前预加载,动态调整有效期或者加分布式锁来解决。
# 缓存雪崩
缓存雪崩是说key对应的数据存在,但是在Redis中过期,此时涌入大量请求导致数据库负载升高。 与缓存穿透不同的是,缓存穿透是单一的key,而雪崩时大量的key。解决办法是缓存失效时间错开,设置过期标识(提前量)并监视更新,使用锁或者队列更新。
# 主从复制
主从复制是配置多台Redis实现读写分离,使得整个系统更容易拓展和恢复。
主从复制的搭建方式:首先以指定配置文件的方式启动多台Redis实例,通常需要修改配置文件中的PID,PORT,RDB文件参数值。然后登录SLAVE主机,通过设置命令 slaveof masterIP masterPORT
来让该实例成为从服务器。 设置成功后可以使用命令 info replication
来查看主从信息。
配置文件DEMO:
include /myreids/redis.conf
pidfile /var/run/redis_6379.pid
port 6379
dbfilename dump6379.rdb
2
3
4
当主从关系建立之后,
1、在主服务上写正常,在从服务上写报错。
2、主服务宕机,重启即可;从服务宕机,需要重启后重新设置。
# 常用的三种模式
一主二从: 启动三个服务实例,其中一个Master实例,两个Slave实例。
薪火相传: 链表形式,上一个Slave是下一个的Master
反客为主: 当Master实例宕机后,在所有的Slave实例中,谁先执行 slaveof no one
,谁就回升级成新的Master实例。
# 哨兵模式(sentinel)
反客为主的自动版本,能够自动检测Master是否故障,然后自动决定一个Slave升级为Master。
配置方法:
1、启动三份实例,配置成一主二从。
2、新建sentinel配置文件: sentinel.conf
sentinel monitor mymaster 127.0.0.1 6379 1
mymaster 为监控对象起的服务器名称, 1 为至少有多少个哨兵同意迁移的数量
3、 执行 redis-sentinel /path/to/sentinel.conf
完成。
当 Master 故障时,sentinel 根据 slave-priority 的值来决定将哪一个slave升级成master。slave-priority 配置在 redis.conf中,值越小优先级越高。
- 01
- DefineSprintBootStarter03-23
- 02
- Spring MVC 启动流程分析03-23
- 03
- GIS 基础知识- 坐标系、投影、EPSG:4326、EPSG:385703-22