Redis学习笔记
一、NoSQL数据库简介
二、redis6概述和安装
与memcache的不同点
- memcache支持单一数据类型 redis支持多种数据类型
- memcache不支持持久化 redis支持持久化
- memcache采取多线程+锁的机制 redis采用单线程+io多路复用
三、常用五大数据类型
1. Redis 字符串
String是Redis最基本的类型 是二进制安全的 value最多512M
incrby decrby 命令具有原子性,不会被线程调度机制打断。(将val增加或减少某值)
- 数据结构:String的数据结构为简单动态字符串。是可以修改的字符串,内部结构实现上类似于Java中的ArrayList,采用与分配冗余空间的方式来减少内存的频繁分配 如果字符串小于1M时,扩容都是加倍现有的空间,超过1M,每次只扩容1M的空间。最大的长度不允许超过512M
2. Redis 列表
Redis列表时简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部或者尾部
它的底层实际是个双向链表,对两端的操作性能很高,通过索引下标的操作中间的节点性能会较差
lpush/rpush lpop/rpop
- 数据结构:quickList 首先在列表元素较少的情况下使用一块连续的内存存储,这个结构时ziplist,也就是压缩列表。它将所有的元素紧挨着一起存储,分配的是一块连续的内存;当数据链比较多的时候次才会改成quickList。因为普通的链表需要的附加指针空间太大,会比较浪费空间。结构上还需要两个额外的指针prev和next
- redis将链表和ziplist结合起来组成了quickList。也就是将多个ziplist使用双向指针串起来使用。这样既满足了快速的插入删除性能,又不会出现太大的空间冗余
3. Redis 集合
Redis set是string类型的无序集合。它底层其实是一个value为null的hash表,所以添加,删除,查找的复杂度都是O(1)
sadd/smembers/sismember/scard(长度)/srem(删除)/spop(随机取)/srandmember(随机取,不会删除)/smove/sinter(交集)/sunion(并集)/sdiff(差集)
4. Redis 哈希
Redis hash是一个String类型的field和value的映射表,hash特别适合用户存储对象。类似Map<String, Object>
hset/hget/hmset/hmget/hexists/hkeys/hvals/
- 数据结构:hash类型对应的数据结构时两种,ziplist(压缩列表),hashtable(哈希表)。当field-value长度较短且个数较少时,使用ziplist,否则使用hashtable
5. Redis 有序集合
Redis 有序集合zset与普通集合set,是一个没有重复元素的字符串集合。每个成员都关联了一个评分,集合的成员是唯一的,得分可以重复。
zadd()/zrange(
- 数据结构:
- hash,hash的作用就是关联元素value和权重score,保障元素value的唯一性,可以通过元素value的唯一性,可以通过元素value找到相应的score值
- 跳跃表,跳跃表的目的在于给元素value排序,根据score的范围获取元素列表
四、Redis配置文件详解
- units —> 单位,只支持bytes,大小写不敏感
- include
- network
- bind:接受某个IP访问
- Protected-mode 是否支持远程访问
- Port 端口号
- Tcp-backlog 正在进行三次握手包括已经完成的队列总和
- Timeout 多长时间超时(0为永不超时)
- Tcp-keepalive (每隔300s检测连接是否活着)
- daemonize 是否支持后台启动
- pidfile 保存进程号的文件路径
- loglevel (日志级别)
- debug
- verbose
- notice
- warning
- Logfile 日志文件在哪
- databases 几号库
五、发布和订阅
Redis 发布订阅是一种消息通信模式:发送者发送消息,订阅者接受消息
Redis客户端可以订阅任意数量的频道
六、Redis新数据类型
1. Bitmaps(类似 编程之美中用二进制数来存储象棋状态)
- Bitmaps 本身不是一种数据类型,实际上它就是字符串,但是它可以对字符串的位进行操作
- Bitmaps 单独提供了一套命令,所以在Redis中使用Bitmaps和使用字符串的方法不太相同,可以把Bitmaps想象成一个以位为单位的数组,数组的每个单元只能存储0和1,数组的下标在Bitmaps中叫做偏移量
2. HyperLogLog(占用内存小,类似set去重)
- 是用来做基数统计的算法,优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定的、并且是很小的
3. Geospatial
- 地理信息
七、Jedis操作Redis
自己看文档去!!!
八、Redis与Spring Boot整合
同上!!!
九、Redis的事务操作
1. Redis的事务定义
Redis事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程汇总,不会被其他客户端发送来的命令请求所打断。
Redis事务的主要作用就是串联多个命令防止别的命令插队
2. Multi、Exec、discard
从输入Multi命令开始,输入的命令都会依次进入命令队列中,但不会执行,直到输入Exec后,Redis才会将之前的命令队列中的命令依次执行。
组队的过程中可以通过discard来放弃组队。
3. 事务的错误处理
- 如果在命令队列中有一个语法错误,那么这个队列将被全部放弃(编译时错误)
- 单独隔离,若语句语法正确但是执行错误,例如让字符串+1,该语句报错(运行时错误)
4. 事务冲突的问题
- 例子:类似超卖现象
- 悲观锁:阻塞