什么是redis
在最近的面试中由于项目需要所以经常被面试官问到redis,所以在图书馆找了书,接下来几篇博客就是为了具体的学习redis,首先redis是完全开源免费的,高性能的kv数据库。关于redis的特点,做下面几点说明:
- 速度快:redis是用C语言实现的,由于直接操纵底层所以语言层面处理速度较快,并且redis的数据都是存在内存中的,内存的执行速度是各层级中最快的,其次redis使用了单线程的架构,避免了多线程的竞争问题
- 后续功能丰富:除了实现了本身的KV存储后海添加了许多额外的功能,利用键过期功能来实现缓存,利用发布订阅功能来实现消息系统,利用Lua脚本来创造新的redis命令,提供了简单的事务功能来保证事务特性,利用流水线功能来批量处理redis命令来减少网络开销。
- 客户端语言多,redis提供了简单的TCP通信协议,随着redis越来越受欢迎,例如Java,PythonPHP等主流语言都支持redis客户端
- 持久化:从长久来看将数据存放在内存中是不安全的,一旦发生断电或者机器故障,就会丢失数据,所以redis提供了RDB与AOF两种持久化方式
- 主从复制:redis提供了复制功能,实现了多个相同数据的redis副本,复制功能是分布式redis的基础,可以主redis进行写操作,从redis进行读操作等减小开支
- 高可用与分布式:redis从2.8后实现了高可用,保证redis节点故障后自动转移,从3.0版本后实现了分布式,提供了高可用,读写与容量的拓展。
redis应用场景
redis由于上述的特性,拥有下面所述的应用场景:
- 缓存:由于redis是内存数据库,所以访问速度快,我们可以读的时候先在redis中查找,写的时候写入后台数据库再同步到redis中实现redis的缓存用法
- 排行榜系统:由于redis提供了列表与有序集合这两种数据结构,可以实现排行榜系统
- 计数器在现在的网站中作用至关重要,由于redis提供了有序集合这种数据结构所以有计数器
- 社交网络:由于关系型数据库不太适合保存这种类型的数据结构,所以redis相对容易的实现。
数据结构
redis内置了五种数据结构作为保存的结构,分别是字符串,哈希,列表,集合和有序集合,接下来我们一个一个来介绍。
字符串
字符串是redis最基础的数据结构,首先键都是字符串类型,而且其他几种数据结构都是在字符串基础上构建的,字符串可以是简单的字符串,也可以是数字甚至是二进制,但是最大值不能超过512MB
set用来添加一个字符串,get用来获取一个字符串,del用来删除一个键值对
字符串的内部编码有三种,当输入的是整数的受,编码为int,当输入小于等于39个字节的字符串的时候是embstr,当输入的是大于39个字节的字符串的时候内部编码是raw,通常用于缓存与计数操作
哈希
几乎所有的编程语言都提供了hash这种数据结构,在redis中哈希是KV结构中的value,也就是说这是一个双重哈希,第一层是redis的KV结构,第二层是redis提供的hash,哈希的内部编码有两种,当哈希类型元素个数小于hash-max-ziplist-entries配置(默认512)同时所有值都小于hash-ziplist-value(默认64字节)的时候redis会使用ziplist做欸哈希的内部实现,ziplist使用更加紧凑的连续存储,节省内存。党无法满足ziplist存储条件的时候,使用hashtable存储,此时ziplist的读写效率会降低,但是hashtable的存储效率是o(1)
常用记录关系型数据库表单信息等。
列表
列表用来存储多个有序的字符串,在开发中可以用列表实现栈或者队列,插入的时候可以从列表的两端插入,列表有两个特点,第一,列表中恶毒元素失有序的,这就意味着可以通过索引下标来获取某个元素或者某个范围内的元素列表,第二,列表中的元素可以是重复的。
列表的内置编码也有两种,当列表的元素个数小于list-max-ziplist-entries并且每个元素值小于list-max-ziplist-value的时候,使用ziplist存储,反之使用linkedlist存储,经常用列表实现消息队列或者文章列表等。
集合
集合也是用来保存多个字符串元素的数据结构,但是和列表不同的是,集合中不允许由重复元素,并且集合中的元素是无序的,不能通过索引获取元素,可以看作是一堆字符串的集合。
当集合中元素都是整数并且元素个数小于set-max-intset-entries的时候,会使用intset来作为集合的内部实现来减少内存的使用,当不满足条件的时候,使用hashtable来作为内部实现。
集合的应用场景为社交网络中的标签等。
有序集合
有序集合保留着不能有重复成员的特性,但是有序集合中的元素可以排序,但是和列表使用下标索引排序的方法不同,他会给每个元素设置一个分数,作为排序的依据有序集合提供了获取指定分数以及元素范围查询,计算成员排名等功能。
当有序集合元素个数小于zset-max-ziplist-rntries同时每一个元素大小小于zest-max-ziplist-value的时候,会使用ziplist作为有序集合的内部实现来减少内存的使用,反之就会使用skiplist。使用的场景通常为排行榜等
第一篇redis学习笔记主要是对于redis有一个基本的认识以及redis中的数据结构和应用场景等,下一篇打算写redis的小功能等用法。