Redis是单进程单线程的,
Redis采用的是基于内存的采用的是单进程单线程模型的KV数据库,由C语言编写。官方提供的数据是可以达到100000+的qps。这个数据不比采用单进程多线程的同样基于内存的KV数据库Memcached差。
Redis快的主要原因是:
- 完全基于内存
- 数据结构简单,对数据操作也简单
- 使用多路 I/O 复用模型
redis 的单进程单线程的,利用队列技术,将并发访问变为串行访问,消除了传统数据库在串行控制的开销。
Redis关于线程安全问题
redis实际上是采用了线程封闭的观念,把任务封闭在一个线程,自然避免了线程安全问题,不过对于需要依赖多个redis操作的复合操作来说,依然需要锁,而且有可能是分布式锁。
1. 使用Redis有哪些好处?
(1) 速度快,因为数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1)
(2) 支持丰富数据类型,支持string,list,set,sorted set,hash
(3) 支持事务,操作都是原子性,所谓的原子性就是对数据的更改要么全部执行,要么全部不执行
(4) 丰富的特性:可用于缓存,消息,按key设置过期时间,过期后将会自动删除
2. redis相比memcached有哪些优势?
(1) memcached所有的值均是简单的字符串,redis作为其替代者,支持更为丰富的数据类型
(2) redis的速度比memcached快很多
(3) redis可以持久化其数据,
详细了解 ,这篇手记 https://www.imooc.com/article/23549
3. Memcache与Redis的区别都有哪些?
存储方式 | Memecache把所有数据存放在内存,断电数据会丢失,数据不能大于内存容量。 | redis部分数据在磁盘,数据持久性。 |
数据支持类型 | Memecache支持相对简单数据类型 | redis支持五大数据类型,string,hash,list,set,storeset, |
使用底层模型不同 | 它们之间底层实现方式 以及与客户端之间通信的应用协议不一样。 | Redis直接自己构建了VM 机制 ,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求。 |
value大小 | memcache只有1MB | redis最大可以达到1GB |
4. MySQL里有2000w数据,redis中只存20w的数据,如何保证redis中的数据都是热点数据
voltile-lru | 从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰 |
volitile-ttl | 从已设置过期时间的数据集(server.db[i].expires)中挑选即将过期的数据淘汰 |
volatile-random | 从已设置过期时间的数据集(server.db[i].expires)中随机挑选数据淘汰 |
allkeys-lru | 从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰 |
allkeys-random | 从数据集server.db[i].dict)中挑选任意数据进行淘汰 |
no-enviction(驱逐) | 禁止驱逐数据 |
推荐 Redis内存回收:LRU算法:https://www.cnblogs.com/WJ5888/p/4371647.html
5.Redis常见数据结构使用场景
Redis官网 : http://www.redis.net.cn/order/3549.html
1. String
常用命令: set,get,decr,incr,mget 等。
String数据结构是简单的key-value类型,value其实不仅可以是String,也可以是数字。
常规key-value缓存应用;
常规计数:微博数,粉丝数等。
2.Hash
常用命令: hget,hset,hgetall 等。
hash是一个string类型的filed和value的映射表,适合存储对象。可以用hash结构来存储用户信息,商品信息等等。
推荐阅读 ,《一文轻松搞懂redis集群原理及搭建与使用》: https://juejin.im/post/5ad54d76f265da23970759d3
hash键意义何在,为什么有string类型还要hasn呢?
- hash键可以将信息凝聚在一起,而不是直接分散的存储在整个reis中,方便数据管理,还可以尽量避免一些误操作。比如,存储用户信息,商品信息等等
- 避免键名冲突;hash 用的是二维结构, key - field -value ;键名(key - field)
- 减少内存占用;string 的key可以设置定时过期时间,redis会自动扫描所有的key,但是hash的key不会。
不适合用hash键的情况,对比string
- 过期功能的使用,过期功能只能设置在string key上;
- 二进制操作命令,如:setbit、getbit、bitop
- 需要考虑数据量分布的问题;Redis Cluster采用虚拟槽分区,所有的键根据哈希函数映射到0~16383个整数槽内,每个节点负责维护一部分槽以及槽所印映射的键值数据。如果,key都要表名(商品信息表+字段+value的形式存储),则经过哈希哈数后,数据就会落到同一个数据槽。
3.List
常用命令: lpush,rpush,lpop,rpop,lrange等
list就是链表,Redis list很多场景用到,比如:微博的关注列表,粉丝列表,最新消息排行功能。
Redis list 的实现就是一个双向链表,支持正反向查询,遍历,方便操作,不会带来额外内存的开销。
4.Set
常用命令: sadd,spop,smembers,sunion 等
set对外提供的功能与list类似是一个列表的功能,特殊之处在于set是可以自动排重的。
当你需要存储一个列表数据,又不希望出现重复数据时,set是一个很好的选择,并且set提供了判断某个成员是否在一个set集合内的重要接口,这个也是list所不能提供的。
在微博应用中,可以将一个用户所有的关注人存在一个集合中,将其所有粉丝存在一个集合。Redis可以非常方便的实现如共同关注、共同喜好、二度好友等功能。
5.Sorted Set
常用命令: zadd,zrange,zrem,zcard等
和set相比,sorted set增加了一个权重参数score,使得集合中的元素能够按score进行有序排列。
在直播系统中,实时排行信息包含直播间在线用户列表,各种礼物排行榜,弹幕消息(可以理解为按消息维度的消息排行榜)等信息,适合使用Redis中的SortedSet结构进行存储。
6.虚拟内存
key小value大 | 使用VM的效果会比较好.因为这样节约的内存比较大 |
key大 | 可以考虑使用一些非常方法将很大的key变成更大的value。比如可以考虑将key,value组合成一个新的value. |
vm-max-threads这个参数,可以设置访问swap文件的线程数,设置最好不要超过机器的核数,如果设置为0,那么所有对swap文件的操作都是串行的.可能会造成比较长时间的延迟,但是对数据完整性有很好的保证. |
Redis的n种妙用,不仅仅是缓存
redis是键值对的数据库,常用的五种数据类型为字符串类型(string),散列类型(hash),列表类型(list),集合类型(set),有序集合类型(zset)
《Redis深入之道:原理解析、场景使用以及视频解读》:https://zhuanlan.zhihu.com/p/28073983:
主要介绍了:Redis集群开源的方案、Redis协议简介及持久化Aof文件解析、Redis短连接性能优化等等内容,文章干货太大,容量很大,建议时间充裕可以看看。另外文章里面还提供了视频讲解,可以说是非常非常用心了。
《阿里云Redis混合存储典型场景:如何轻松搭建视频直播间系统》:https://yq.aliyun.com/articles/582487?utm_content=m_46529:
主要介绍视频直播间系统,以及如何使用阿里云Redis混合存储实例方便快捷的构建大数据量,低延迟的视频直播间服务。还介绍到了我们之前提高过的redis的数据结构的使用场景
《美团在Redis上踩过的一些坑-5.redis cluster遇到的一些问》:http://carlosfu.iteye.com/blog/2254573:主要介绍了redis集群的两个常见问题,然后分享了 一些关于redis集群不错的文章。
t推荐 视频 细数Redis在互联网应用中的应用场景
链接:https://pan.baidu.com/s/1ce7n_A0m_Xy9tl9hnmOTvw
提取码:5uu3