redis初学习
redis 数据类型(5种常用)
类型 | Key | Value | 特点 |
---|---|---|---|
string | String | String | 可以包含任何数据(JSON) |
hash | String | Map<String, String> | 相当于Java的Map |
list | String | LinkedList | 字符串双向列表,按照插入顺序排序, 可重复 存取有序 |
set | String | HashSet | 字符串无序集合, 不可重复 存取无序 |
zset | String | TreeSet | 字符串有序集合, 按分数(score)排序, 不可重复 存取无序 |
string
基本操作
- 添加修改数据
set key value
- 查询数据
get key value
- 删除数据
del key
- 添加修改多个数据
mset key1 value1 key2 value2 ...
- 查询多个数据
mget key1 key2 ...
- 获取数据字符的长度
strlen key
- 追加信息到原始数据后 (如果没有原始数据 则新建)
append key value
扩展操作
- 解决一张表数据量过大问题,将一张表拆分成多张表(设置主键不唯一)
增加或减少有效值
incr(decr) key
incrby(decrby) key increment
incrbyfloat key increment (可正可负可小数)
- 解决每天投票(设置数据的生命周期)
设置数据具有指定的生命周期
setex key seconds value
psetex key milliseconds value
hash
一个存储空间保存多个键值对数据(典型存取对象信息)
- 应用场景: 购物车,实现抢购
基本操作
- 添加/修改数据
hset key filed value
- 查询数据
hget key filed
hgetall key
- 删除数据
hdel key filed1 [filed2]
- 添加/修改多个数据
hmset key filed1 value1 filed2 value2
- 查询多个数据
hmget key filed1 filed2 ...
hgetall key
- 删除数据
hdel key filed1 [filed2]
- 获取hash表中的字段数量
hlen key
- hash表中是否存在指定字段
hexists key filed
扩展操作
- 获取hash表中的所有字段名或字段值
hkeys key
hvals key
- 设置指定字段的数值增加指定值
hincrby key filed increment
hincrbyfloat key filed increment
set
存储大量数据,高效的存储机制,便于查询
于hash的存储结构完全相同,只存键,不存值(nil)
- 应用场景:网站访问量,黑白名单
基本操作
- 增加数据
sadd key member...
- 获取全部数据
smembers key
- 删除数据
srem key member
- 获取集合中的数据总量
scard key
- 判断是否包含指定数据
sisnumber key number
扩展操作
- 随机获取指定数量的数据
srandmember key [number]
- 随机获取某个数据并移出集合
spop key
- 两个集合的交,并,差集
sinter key1 key2
sunion key1 key2
sdiff key1 key2
- 求两个集合的交,并,差集并保存到指定集合
sinterstore destination key1 key2
sunionstore destination key1 key2
sdiffstore destination key1 key2
- 将指定数据从原集合中移到指定集合
smove source destination member
sorted_set
有序展示
与set相比多了排序字段(score)
基本操作
- 添加数据
zadd key score1 member1 [score2 member2]
- 获取全部数据
zrange key start stop [WITHSCORES] (可带排序字段)
zrevrange key start stop [WITHSCORES]
- 删除数据
zrem key member1 ...
- 按条件获取数据
zrangebyscore key min max [WITHSCORE] [LIMIT]
zrevrangebyscore key max min [WITHSCORE]
- 按条件删除
zremrangebyscore key min max
zremrangebyrank key start stop(按索引删除)
- 获取集合数据总量
zcard key
zcount key min max
- 集合交并操作
zinterstore destination numkeys key [key ...](numkeys是几后面就需要跟几个key)
zunionstore destination numkeys key [key ...]
聚合操作:SUN MAX MIN
zinterstore destination numkeys key [key ...] aggregate SUN\MAX\MIN
扩展操作
- 获取数据对应的索引(排名)
zrank key member
zrevrank key member
- score值的获取与修改
zscore key member
zincrby key increment member
通用命令
key
基本操作
- 删除指定key
del key
- 判断key是否存在
exists key
- 获取key的类型
type key
扩展操作
- 为指定key设置有效期
expire key seconds
pexpire key milliseconds
expireat key seconds-timestamp
pexpireat key milliseconds-timestamp
- 获取key的有效期
ttl key
pttl key
- 切换key从时效性到永久性(持久化)
persist key
- 查询key
keys pattern (*?[])
- 为key改名
rename key newkey
renamex key newkey(判断是否存在)
- 对所有key排序
sort
数据库通用指令
基本操作
- 切换数据库(一共有16个数据库 0~15)
select index
- 数据移动(剪切操作)
move key db
- 数据清除
dbsize
flushdb
flushall
Jedis
客户端连接Jedis
//连接redis
Jedis jedis = new Jedis("localhost",6379);
//操作redis
jedis.set("name","helloworld");
jedis.get("name");
//关闭redis
jedis.close();
redis持久化
RDB
- save 手动进行一次保存,会生成一个.rdb数据文件
save指令会阻塞当前的redis服务,知道RDB过程完成为止,会造成长时间的阻塞 - bgsave 手动启动后台保存操作 针对save阻塞问题的优化
- 配置 save second changes 限定时间范围内key的辩护士数量达到指定数量进行持久化
在conf文件中配置
优点:
RDB是一个紧凑压缩的二进制文件,存储效率高,适用于数据备份,全量复制等场景
恢复数据比AOF快很多
缺点:
无法做到实时持久化,很可能丢失数据;
数据量巨大时,效率非常低,IO性能较低
bgsave每次执行都要执行fork操作创建子进程,损失性能
多版本EDB文件格式不统一,可能会出现不兼容的情况
AOF
- 以独立日志的方式记录每次写命令,重启时再重新执行AOOF文件中的命令,达到数据恢复.
与RDB相比:改记录数据为记录数据产生的过程 - 解决了数据持久化的实时性,目前redis持久化的主流方式
AOF持久化策略
- always (每次)
每次操作都同步到AOF文件中,数据零误差,性能较低 - everysec(每秒)
每秒将缓存区的指令同步到AOF文件中去,数据准确性较高,性能较高
在系统突然宕机的时候丢失一秒的数据 - no(系统控制)
由系统控制每次同步到AOF文件的周期,过程不可控
AOF功能开启
配置:appendonly yes|no (默认no)
作用:是否开启AOF持久化功能,默认不开启
配置:appendfsnc always|everysec|no
AOF重写
将多条指令转化成最终结果指令
- 作用
减低磁盘占用,提高磁盘利用率
提高持久化效率,减低持久化写时间,提高IO性能
降低数据恢复用时,提高数据回复率
事务
将一系列预定命令包装成一个整体(一个队列),执行时按照添加顺序依次执行,不被打断或者干扰
事务基本操作
- 开启事务
multi
作用:设定事务开始的位置,后续的所有命令都加到事务中
- 执行事务
exec
作用:设定事务结束的位置,并执行事务,于multi成对出现使用
- 取消事务
discard
作用:终止当前事务的定义,在multi后,exec前
锁
- 对key添加监视锁,在执行exexc前如果key发生了变化,终止事务的执行
watch key1 [key2 ...]
- 取消所有对key的监视
unwatch
分布式锁
- 使用setnx设置一个公共锁
setnx lock-key value (value代表线程id 防止别人删除掉你的锁)
操作完毕后通过del操作释放锁
死锁的解决方案
- 使用expire为锁key添加时间限定,到时自动释放锁
expire lock-key second
pexpire lock-key millionseconds
删除策略
数据删除策略
定时删除 惰性删除 定期删除
逐出算法
- 最大可用内存
maxmemory
占用物理内存的比例,默认值为0 不限制
- 每次选取删除的数据个数
maxmemory-samples
选取数据时并不会在全库扫描,
- 删除策略
maxmemory-policy
达到最大内存后,对挑选出来的数据进行删除策略
八种策略:
- 检测易失数据(可能会过期数据)
volatile-lru:最近最少使用数据
volatile-lfu:最近使用次数最少数据
volatile-ttl:即将过期数据
volatile-random:随机数据 - 检测全库数据(所有数据集)
allkeys-lru:最近最少使用数据
allkeys-lfu:最近使用次数最少数据
allkeys–random:随机数据
*放弃数据驱逐
no-enviction(驱逐):禁止驱逐
高级数据类型
bitmaps
基本操作
- 获取指定key对应偏移量上的bit值
getbit key offset
- 设置指定key对应偏移量上的bit值,value只能是0或1
setbit key offset value
扩展操作
- 对指定key按位进行交|并|非|异或操作,并将结果保存到destkey中
bitop op destkey key1 [key2 ...]
op: and:交 or:并 not:非 xor:异或
- 统计指定key中1的数量
bitcount key [start end]
HperLogLog
基本操作
- 添加数据
pfadd key element [element ...]
- 统计数据
pfcount key [key ...]
- 合并数据
pfmerage destkey sourcekey [sourcekey ...]
GEO
基本操作
- 添加坐标点
geoadd key longitude latitude member [longitude latitude member ...]
- 获取坐标点
geopos key member [member ...]
- 计算坐标点距离
geodist key member1 member2 [unit]
- 根据坐标求范围内的数据
georadius key longitude latitude radius m|km|ft|mi [withcoord] [withdist] [withhash] [count count]
- 根据点求范围内的数据
georadiusbymember key member radius m|km|ft|mi [withcoord] [withdist] [withhash] [count count]
- 获取指定点对应坐标的hash值
geohash key member [member ...]
redis集群
主从复制
哨兵模式
集群
解决方案
缓存预热
系统启动前,提前将高热度的缓存数据加载到缓存内存中.避免大量请求,先查询数据库,再缓存数据的问题
缓存雪崩
瞬间过期数据量太大,导致对数据库服务器造成巨大压力,甚至崩溃.
方案:通过随机值设置过期时间.超热数据设置永久性
监控访问量,热度突然增大,延长过期时间
加锁
缓存击穿
单个高热度数据过期的瞬间,数据访问量较大,未命中redis后,发起大量对数据访问的请求,导致对数据库服务器造成压力
方案:预防为主
监测访问量,延长过期时间
加锁
缓存穿透
访问不存在的数据,跳过数据缓存阶段,每次访问数据库,都对数据库服务造成压力
方案:缓存null,设定短时限
布隆过滤器(白名单策略)
key加密