一、Redis介绍
1、强一致性:任何时刻所有用户查询到的都是最新的数据。(关系型数据库的更新操作)
最终一致性:某一时刻不同用户或进程查到的数据可能不同,但是最终更新成功的数据都能查到。(主流NoSQL是这种)
NoSQL:基于内存的数据库,提供一定的持久化功能。Redis和MongoDB就是NoSQL。
2、Redis性能优越:支持每秒十几万次的读/写操作;
Redis支持集群、分布式、主从同步等;
支持多种数据结构类型;
3、redis单线程:单个线程处理所有的网络请求,其他模块仍然用多线程(事件处理器解决task用多线程)。
4、redis的应用:缓存、需要高速读/写场景当DB使用、分布式锁、token生成、session共享等
缓存场景:比如查业务线信息、客服信息、话术配置等,高频读低频写的场景,适合加缓存;
需要高速读/写场景:直接读写redis,当db用,快速业务响应。(拉会话数据类似这个场景,db和redis都写,只查redis)
5、redis的事务:WATCH key类似乐观锁,监视一些key如果执行过程被改则中断;MULTI指令开始事务;EXEC执行事务。
redis的事务比较鸡肋:生产都是redis集群做了数据分片操作,事务中操作多个key不一定落在同一个节点上。
6、credis封的jedis,执行时间超过10ms时打了监控。
二、Redis和memcached的比较
1.都是内存数据库,memcached还可以存图片、视频。
2.存储数据类型:memcached的value只能是String,redis支持string/hash/list/set/sortedSet等数据结构。
3.虚拟内存:redis当内存用完时,可以把很久没用的value放到磁盘。
4.redis是单线程,memcached是多线程的。
5.Redis更可靠:memcached不支持持久化;redis可通过RDB快照和AOF日志持久化,所以支持灾难恢复,支持主从数据备份。
6.应用场景:redis除了可以做NoSQL数据库使用,还可以做消息队列、分布式锁等。
三、为什么单线程的Redis效率比多线程的memcached要高
1、非阻塞IO、IO多路复用机制:一个线程处理多个socket连接,将产生事件的socket压入内存队列中,再通过文件事件处理器(file event handler)交给对应的处理器解决。
2、纯内存操作,读写快;
3、单线程,避免了多线程上下文切换开销;
4、使用hash结构或其他有序数据结构,读写快;
生产上对redis的使用:
1. 当DB使用,会话数据在redis都有一份。(为了更快的查询效率,牺牲了一部分一致性)
2. redis分布式锁,防止短时间内相同参数同时调用,导致代码同时执行。跑完了删key释放锁。
3. 当缓存使用,例如在搜索的时候,同一个uid+搜索关键字,在短时间内重复请求,直接返回redis缓存里面的数据。