在上学期的Java软件构件这门课上有使用到过Redis,只是当时老师的教学比较抽象,就连Redis的基本原理也没则没搞懂。这篇文章就梳理我在本Redis课程中学到的知识。
一、什么是Redis
Redis:即远程字典服务,是一个由C语言开发、开源的、支持网络交互的、可基于内存也可持久化的超高性能Key-Vlaue数据库。
三、Redis应用案例
1.String字符串
String类型是redis的最基础的数据结构,也是最经常使用到的类型。 而且其他的四种类型多多少少都是在字符串类型的基础上构建的,所以String类型是redis的基础。
String字符串的应用场景
- 缓存功能:String字符串是最常用的数据类型,不仅仅是redis,各个语言都是最基本类型,因此,利用redis作为缓存,配合其它数据库作为存储层,利用redis支持高并发的特点,可以大大加快系统的读写速度、以及降低后端数据库的压力。
- 计数器:许多系统都会使用redis作为系统的实时计数器,可以快速实现计数和查询的功能。而且最终的数据结果可以按照特定的时间落地到数据库或者其它存储介质当中进行永久保存。
- 统计多单位的数量:eg,uid:gongming count:0 根据不同的uid更新count数量。
- 连续签到(如图所示)。
2.用list作为消息队列
list类型是用来存储多个有序的字符串的,列表当中的每一个字符看做一个元素。
list使用场景
- 消息通知:例如有文章更新时,就将新文章发送到ES,这样用户就可以搜索到最新文章资讯了。
- 快速链表quicklist:快速链表是Redis3.2之后引入的一种数据类型, 该结构它是由链表和压缩链表结合起来的一种结构, 即是一个双向链表, 并且链表中的每一个节点是一个压缩链表. 这样的设计能在时间效率和空间效率上实现较好的折中。
3.Hash储存结构
- 如一个用户有多项数据需要储存,可通过Hash结构来储存(如图所示)。
- 渐进式rehash:所谓渐进式rehash是指我们的大字典的扩容是比较消耗时间的,需要重新申请新的数组,然后将旧字典所有链表的元素重新挂接到新的数组下面,是一个O(n)的操作。但是因为我们的redis是单线程的,无法承受这样的耗时过程,所以采用了渐进式rehash小步搬迁,虽然慢一点,但是可以搬迁完毕。其中,rehash步骤为:
- 1、为ht[1] 分配空间,让字典同时持有ht[0]和ht[1]两个哈希表;
- 2、定时维持一个索引计数器变量rehashidx,并将它的值设置为0,表示rehash 开始;
- 3、在rehash进行期间,每次对字典执行CRUD操作时,程序除了执行指定的操作以外,还会将ht[0]中的数据rehash 到ht[1]表中,并且将rehashidx加一;
- 4、当ht[0]中所有数据转移到ht[1]中时,将rehashidx 设置成-1,表示rehash 结束;
- 5、将ht[0]释放,然后将ht[1]设置成ht[0],最后为ht[1]分配一个空白哈希表。
分布式锁
分布式锁其实就是,控制分布式系统不同进程共同访问共享资源的一种锁的实现。如果不同的系统或同一个系统的不同主机之间共享了某个临界资源,往往需要互斥来防止彼此干扰,以保证一致性。并发场景下,要求一次只能有一个协程执行。执行完成后,其他等待中的协程才能执行。可以使用Redis的setnx实现,利用了两个特性:
- Redis是单线程执行命令
- setnx只有未设置过才能成功