目录
上一篇博客已经介绍了Redis的安装与集群, 但是安装好了应该怎么使用呢?? 接下来简单介绍下Redis的使用
Redis基础介绍
用途
关于Redis的介绍, 查看上一篇博客内容, 这块我们主要来看看Redis可以用在那些方面
- 缓存用户信息
- 如果ID是整数自增的话, 那么可以通过Redis来实现
- 缓存广告访问信息
- 消息队列
- 统计访问网站的独立IP
等等。。。
当然还有很多方面的应用, 不过在数据访问不大的情况下,程序一般都是直接访问数据库,只有在数据访问高的时候, 一些数据就必须放在Redis中, 提高访问的速率。
Redis 5种基本数据类型
Redis中可以存放5种类型, 分别是:string(字符串),list(列表),hash(字典),set(集合)和zset(有序集合), 这5中类型是Redis中的基础, 也是Redis中最重要的
string
string是Redis中最简单, 最基本的类型,如下, string的内部是一个可以修改的字符数组
H | E | L | L | O | W | O | R | L | D |
相当于Java中的ArrayList, 采用预分配冗余空间的方式来减少频繁的分配空间。 且内部分配空间的实际长度capacity大于字符串的实际长度, 当需要扩容分配空间时
- 当当前字符串的实际长度 < 1MB时, 扩容当前一倍的空间
- 当当前字符串的实际长度 > 1MB时, 每次扩容1MB的空间
注意: string类型最大长度为512M
反思: Java中 ArrayList 是怎么扩容的呢??
string最常用的是存放用户信息, 将用户信息通过JSON序列化为字符串, 将之存放到Redis中, 当然取信息的时候多一个反序列化的过程
【键值对】
【批量键值对】
mget得到的是一个字符串集合
【过期时间和set的扩展】
【计数】
如果value是一个整数, 可以对它进行自增/自减, 计数会有一个范围在signed long的最大和最小之间, 超出这个范围会出错
更多相关的命令:https://redis.io/commands
list
list相当于Java中的LinkedList, 所以list在插入/删除的效率很高, 时间复杂度为(1), 但是在索引检索方面的效率很低, 时间复杂度为O(n)。 并且list设置了双向指针顺序, 支持前向后向来遍历list, 如下 (不专业画图30年)
list常用于处理异步队列, 将需要延后处理的任务消息体序列成字符串, 然后塞进list中, 另一个线程通过轮询的方式处理消息
【右进左出:队列】
队列是一种先进先出的数据结构, 常用于消息队列处理, 异步逻辑处理, 保证了数据访问顺序的一致性
【右进右出:栈】
栈是一种先进后出的一种数据结构
当list中的最后一个元素被取出, 该数据结构被删除, 内存被回收
hash
hash 可以理解为Java中的HashMap, 也是数组+链表的形式。 不一样的是Redis中的hash都是字符串, 而且它们rehash的方式不一样
Java: HashMap在字典很大时,需要一次性全部加载出来(rehash是一个耗时性操作)
Redis: hash为了提高性能, 不堵塞服务, 所以采用渐进式rehash策略
什么是渐进式rehash策略?
渐进式rehash在rehash的同时, 保留新旧两个hash的结构, 然后会同时查询两个hash结构, 然后在后续的定时任务以及hash操作的过程中, 循序渐进的将旧hash的内容一点点的搬迁到新的hash中, 搬迁完成后, 新的hash就会替代旧的hash结构
hash 可以用在保存用户信息, 将用户每个信息单独存储, 可以避免网络流量的浪费。 同单独存储字符串之间的差距在于:存储消耗要高于单个字符串
set
set 集合相当与Java中的HashSet, 内部键值对都是无序, 唯一的,并且set中是不允许存在重复元素
zset
zset 相当于Java中SortedSet + HashMap, 一方面set的属性, 另一方面,它可以给每个value设置score, 代表这个value的排序权重
总结
关于list,set,hash, zset有一下两点共同点
- 如果容器不存在, 就创建一个再进行操作
- 如果容器没有元素, 就立即删除容器, 释放内存