文章目录
redis概要
Redis 由C语言编写,是基于内存级别的数据库,通常作为缓存使用。
特点:
- 读写效率高,读操作10万次/s; 写操作8万次/s
- 支持事务
- 单线程处理命令,杜绝了并发、上下文切换等问题,效率高
- 可用做分布式锁
为什么Redis快?
- 基于内存
- 网络IO方面,6版本之后采用NIO模式;内存命令处理采用单线程,杜绝了并发竞争以及上下文切换问题
数据类型
字符串
- 字符串本身可以表示三种类型:string、int、byte
- 基于二进制存储 可存储json、JPEG图片
- 单个字符串最大长度为 512M
操作
常规:get、set、del、exists、append
按整形:incr、decr、incrby、decrby
注
:
- append 会使用更多的内存
- 整书共享,再添加时,如果内存中已经存在相同的值,不在创建而是复用。注意引起的LRU淘汰策略问题
- 精度问题 最大保证16位,过长的整数存储可能丢失精度。可在代码层面存储chart型进行规避
hash
就是一个 hash散列表,和Java层面的map数据结构类似,数组+链表结构;
少量的字段竞占用很少的空间?
list
链表结构,类似数据结构中的双端链表,支持两端进出已经中间的范围查询
set
无序的集合,不允许只重复,提供添加、查找、删除操作。这些操作都是O(1)级别?,另外支持 交集、差集、并集操作,
zset
有序集合,使用上相比set在存储时 需要value前边关联一个数值,用于排序
位图
?进行与或运算,用于位运算的比较
地理位置
以某个点为圆心,计算其他点到此圆心的距离
使用场景
1. 缓存
- 长时间不变的数据缓存
- 热点数据缓存
- 会话缓存
2. 业务处理
基于set数据类型的排行榜、排名
3. 全局的一致计数
- 浏览量
4. 发布订阅
5. 分布式锁
- 获得锁
对于全局的数据,借助redis的单线程处理排除竞争关系,另外借助setnx
判断是否存在已经已经上了锁,另外借助px
命令防止锁问题,当超过设定的只之后,自动释放锁
sql
set key value nx px 30000
- 释放锁
释放锁的阶段并不是原子,包含查询和删除两个阶段,如果在查询时遇到了Redis中的锁超时自动释放的情况,被其他线程持有,那会会造成全局锁的混乱。
基于以上情况课次阿勇lua脚本,此脚本在查询和释放层面是原子操作,避免因锁释放引起的全局锁问题。
shell
if redis.call("get",KEYS[1])==ARG[1] then
return redis.call("del",KEYS[1])
else
return 0
end
原子性 超时 互斥
持久化机制
有两种RDB和AOF
RDB(默认)
周期性的将redis中的缓存喜爱那个dump.rdb文件中存储一份,恢复时,直接加载此文件
优点:
- 启动效率高
- 使用子进程IO同步,不影响主进程的执行
- 只有一个rdb文件,方便持久化,容灾性好
缺点 - redis崩溃时,有可能会造成一段短时间的数据丢失
AOF
可配置的方式,每处理一个命令记录一次,或者每一批命令记录一次,可'appendfsync'配置,记录到一个类似binlog的文件中;
记录的是命令而不是数据。
优点:
保证数据的安全性
缺点:
- 文件大,启动慢
- Redis效率低,