事物四大特性:
- 原子性(Atomicity): 事务是最小的执行单位,不允许分割。事务的原子性确保动作要么全部完成,要么完全不起作用;
- 隔离性(Isolation): 并发访问数据库时,一个用户的事务不被其他事务所干扰,各并发事务之间数据库是独立的;
- 持久性(Durability): 一个事务被提交之后。它对数据库中数据的改变是持久的,即使数据库发生故障也不应该对其有任何影响。
- 一致性(Consistency): 执行事务前后,数据保持一致,多个事务对同一个数据读取的结果是相同的;
Redis 是不支持 roll back 的,因而不满足原子性的(而且不满足持久性)。
Redis:数据存在内存中;应用场景:缓存,分布式锁,消息队列
Redis数据结构
string : 一般常用在需要计数的场景,比如用户的访问次数、热点文章的点赞转发数量等等。
set key value #设置 key-value 类型的值
get key # 根据 key 获得对应的 value
exists key # 判断某个 key 是否存在
strlen key # 返回 key 所储存的字符串值的长度
del key # 删除某个 key 对应的值
list : 双向链表,发布与订阅或者说消息队列、慢查询。
rpush myList value1 # 向 list 的头部(右边)添加元素
rpush myList value2 value3 # 向list的头部(最右边)添加多个元素
lpop myList # 将 list的尾部(最左边)元素取出
lrange myList 0 1 # 查看对应下标的list列表, 0 为 start,1为 end
lrange myList 0 -1 # 查看列表中的所有元素,-1表示倒数第一
hash : 存储对象
hmset userInfoKey name "guide" description "dev" age "24"
hexists userInfoKey name # 查看 key 对应的 value中指定的字段是否存在
hget userInfoKey name # 获取存储在哈希表中指定字段的值
hgetall userInfoKey # 获取在哈希表中指定 key 的所有字段和值
hkeys userInfoKey # 获取 key 列表
hvals userInfoKey # 获取 value 列表
hset userInfoKey name "GuideGeGe" # 修改某个字段对应的值
set : 无序不重复集合
sadd mySet value1 value2 # 添加元素进去
smembers mySet # 查看 set 中所有的元素
scard mySet # 查看 set 的长度
sismember mySet value1 # 检查某个元素是否存在set 中,只能接收单个元素
sinterstore mySet3 mySet mySet2 # 获取 mySet 和 mySet2 的交集并存放在 mySet3 中
sorted set : 在set上增加了一个权重参数score,使元素能按权重排序
zadd myZset 3.0 value1 # 添加元素到 sorted set 中 3.0 为权重
zadd myZset 2.0 value2 1.0 value3 # 一次添加多个元素
zcard myZset # 查看 sorted set 中的元素数量
zscore myZset value1 # 查看某个 value 的权重
zrange myZset 0 -1 # 顺序输出某个范围区间的元素,0 -1 表示输出所有元素
zrange myZset 0 1 # 顺序输出某个范围区间的元素,0 为 start 1 为 stop
zrevrange myZset 0 1 # 逆序输出某个范围区间的元素,0 为 start 1 为 stop
Redis 的性能瓶颈不在 CPU ,主要在内存和网络,Redis6.0 引入多线程主要是为了提高网络 IO 读写性能
Redis采用惰性删除 + 定期删除 策略处理过期数据:
惰性删除 :只会在取出 key 的时候才对数据进行过期检查。这样对 CPU 最友好,但是可能会造成太多过期 key 没有被删除。
定期删除 : 每隔一段时间抽取一批 key 执行删除过期 key 操作。并且,Redis 底层会通过限制删除操作执行的时长和频率来减少删除操作对 CPU 时间的影响
Redis 持久化机制:
快照持久化:通过创建快照来获得存储在内存里面的数据在某个时间点上的副本
例:save 60 10000 #在60秒(1分钟)之后,如果至少有10000个key发生变化,Redis就会自动触发BGSAVE命令创建快照。
AOF持久化:每执行一条会更改 Redis 中的数据的命令,Redis 就会将该命令写入硬盘中的 AOF 文件。主流
Redis 可以通过 MULTI,EXEC,DISCARD 和 WATCH 等命令来实现事务(transaction)功能
缓存穿透:大量请求的 key 根本不存在于缓存中,导致请求直接到了数据库上,根本没有经过缓存这一层。
缓存雪崩:有一些被大量访问数据(热点缓存)在某一时刻大面积失效,导致对应的请求直接落到了数据库上