Java核心篇之Redis–day4
-
Redis有哪些数据结构?
字符串String、字典Hash、列表List、集合Set、有序集合SortedSet。1.String:字符串,常用命令:get,set,decr,incr,mget(查询多个key)
2.Hash类型:hset(添加赋值)/hget(查询)/hgetall(查询所有字段和值)等。
3.list(列表类型):lpush(列表头部添加元素)/rpush(列表尾部添加元素)/lpop(头部删除元素)/rpop(尾部删除元素)/lrange(查询元素):不支持嵌套其他数据类型,应用场景很多,存储文章评论列表,存储用户的粉丝列表,黑名单列表等,也可以作为重要的消息队列来使用。Redis的list数据结构的实现是一个双向链表,支持正向反向遍历查找,方便用户操作的同时,也增加了内存开销。
4.Set集合类型:Redis集合是字符串的不重复无序结构。常用命令有sadd(添加元素)/spop(删除)/smembers(查询)/sunion(添加多个集合)等,不支持嵌套其他数据类型,提供自动去重的功能(内部实现是一个value永远为null的hashmap)
5.Zset(sorted set)在set基础上关联一个score,通过score来实现排序的功能。(应用到的场合:实现文章按点击量排序,微博热搜榜,论坛热帖) -
高级应用:
- Redis发布订阅功能:发布订阅是一种消息的通信模式:发布者发布信息,订阅者接受信息,主要是为了解耦消息的发布者和订阅者,redis作为一个发布订阅的server,在订阅和发布之间起到了消息路由的作用。订阅者可以通过subscribe和psubscribe命令向redis server订阅自己感兴趣的消息类型,redis将消息类型称为通道channel。当发布者向redis server发布特定类型的消息的时候,订阅该消息的所有client都会收到此消息。
- Redis支持事务功能:Redis的事务功能主要是保证同一个client发起的事务中的命令可以连续执行,而中间不会插入另一个客户端的命令。当一个客户端发起事务命令multi时,这个连接会进入一个事务上下文,该命令后续的命令不会立即执行,而是先放到一个queue中,当此连接收到exec命令后,redis才会顺序的执行队列中的命令,如何将所有命令结果返回给客户端。
- Redis的管道功能:Redis管道功能是指客户端在同一个请求中同时发送多个命令,在这个过程中无需等待每个命令的响应,而是在组合读取每个命令的响应回复。
- Redis的持久化功能:Redis 是一个基于内存的数据库,但是他也是支持数据持久化的,如果业务需要,可以开启业务持久化的功能,将内存数据持久化到磁盘中,从而保证数据的安全和完整性。
- 两种常用的持久化方式有:RDB(redis database)AOF(append only file)两种常用的持久化方式有:
- RDB(redis database)AOF(append only file)RDB(redis database)AOF(append only file)
RDB:在不同的时间点,将redis存储的数据生成快照并存储到磁盘等介质上;
AOF:将执行过的指令记录下来,在数据恢复时按照从前到后的顺序再将指令都执行一遍,从而恢复数据。
-
Redis作为一个内存数据库,优势如下:使用redis的好处:快速,持久化,事务原子性,单线程,缓存,多种类型
- (1)异常快:Redis非常快,每秒可执行大约110000次的设置(SET)操作,每秒大约可执行81000次的读取/获取(GET)操作。
- (2)支持丰富的数据类型: Redis支持开发人员常用的大多数数据类型,例如列表、集合、排序集和散列等等。
- (3)操作具有原子性:单进程单线程作业,所有操作都是原子操作,这确保如果两个客户端并发访问,Redis服务器能接收更新的值。
- (4)多实用工具:是一个多实用工具,可用于多种用例,如:缓存、消息队列(Redis本地支持发布/订阅)、应用程序中的任何短期数据。例如,WEB应用程序中的会话、网页命中计数等。
-
使用过Redis分布式锁么,它是什么回事?
-
先拿setnx来争抢锁,抢到之后,再用expire给锁加一个过期时间防止锁忘记了释放。
这时候对方会告诉你说你回答得不错,然后接着问如果在setnx之后执行expire之前进程意外crash或者要重启维护了,那会怎么样?
这时候你要给予惊讶的反馈:唉,是喔,这个锁就永远得不到释放了。紧接着你需要抓一抓自己得脑袋,故作思考片刻,好像接下来的结果是你主动思考出来的,然后回答:我记得set指令有非常复杂的参数,这个应该是可以同时把setnx和expire合成一条指令来用的!对方这时会显露笑容,心里开始默念:摁,这小子还不错。https://juejin.im/post/5b16148a518825136137c8db