redis简介
简介
redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步
使用场景
1.缓存系统:
会话缓存
全页缓存
2.计数器
3.消息队列系统
4.排行榜
5.社交网络
6.实时系统
7.布隆过滤器
数据类型
字符串类型:用来实现简单的KV简直对存储,比如计数器
String:整数或者sds(simple dynamic string)
哈希类型:
ziplist或者hashtable
列表类型:实现双向链表,用户的关注、粉丝列表
list:ziplist或者double linked list
集合类型:存储不重复元素,不如用户的关注着
intset或者hashtable
有序集合类型:实时信息排行榜
skiplist
数据一致性问题
1.缓存穿透:
大量查询不到的数据的请求落到后段数据库,数据库压力增大
# 由于大量缓存查不到就去数据库取,数据库也没有要查的数据
# 解决:对于没有查到的返回为None的数据也缓存
# 插入数据的时候删除相应缓存,或者设置较短的超时时间
2.缓存击穿:
某些非常热点的数据key过期,大量请求打到后段数据库
# 热点数据key失效导致大量请求达到数据库增加数据库压力
# 分布式锁:获取锁的线程从数据库拉数据更新混存,其他线程等待
# 异步后台更新:后台任务针对过期的key自动刷新
3.雪崩问题
胡纳村不可用或者大量缓存key同时失效,大量请求直接打到数据库
多级缓存:不同级别的key设置不同的超时时间
随机超时:key的超时时间随机设置,方式同时超时
架构层:提升系统可用性,监控、报警完善
redis特性
缓解关系型数据库(Mysql)并发访问的压力:热点数据
减少相应时间:内存IO速度远比磁盘快
提升吞吐量:Redis单机支持很高的并发
10w OPS # 每秒10w次读写
数据存放在内存
使用C语言编写
单线程
redis优点
1. 速度快,因为数据存在内存中,类似于HashMap,查找和操作的时间复杂度都只是O(1)
2. 支持丰富的数据类型,string,list,set,sorted set,hash
3. 支持事务,操作都是原子性,即要门全部执行完成,要么全部不执行
4. 丰富的特性,可以用于缓存消息,设置过期时间,过期后自动删除数据
redis和memcache的区别
同:
都是将数据缓存到内存中
异:
1.支持存储的数据类型:
redis 支持value存储的数据类型有5种 string(字符串)、list(链表)、set(集合)、zset(sorted set - -有序集合)和hash(哈希类型)
memcache 仅支持 字符串的存储
2.持久化:
redis 支持持久化的存储
memcache 存储基于LRU,不支持持久化,当出现宕机数据会丢失
3.线程:
redis 采用的是单线程服务(意味着会有较多的阻塞情况),单线程IO复用模型
memcache 采用的是多线程(意味着阻塞相对较少),非阻塞IO复用网络模型
程序的道路上一去不复返