//-------- redis 缓存数据库 总结(大全) ------------
-----------------> String
1. 点赞操作 粉丝数量等
incr/incrby key 当前键自增+1/自增+n 并返回递增后的值
decr/decrby 自减
append 尾部追加
strlen 字符串长度
mset mget 同时设置/获取多个值
~~~~> 实战用(面试)
博客的字数统计如何实现?(strlen)
如何将审计日志不断追加到指定key?(append)
你如何实现一个分布式自增id?(incr-64bit的Long id 分布式常用id)
如何实现一个博客的的点赞操作?(incr,decr)
---------------------> hash
1. 相当于java的hashmap 储存对象信息 字段和字段值的映射
01 hset/hget 设置 对象 字段 字段名
hset user username LC
02 hgetall 对象 获取这个对象的所有字段值
hgetall user
03 hincrby
04 hmset/hmget 设置/获取对象属性
hset person username tony age 18 获取值的时候也是通过对象 字段 字段名
05 hexists 判断属性是否存在
06 hdel 删除属性
hdel user age
07 hkeys/hvals 只获取字段名/字段值(对象所有的...)
~~~~>实战用(面试)
发布一篇博客需要写内存吗?(需要,hmset)
浏览博客内容会怎么做?(hmget)
如何判定一篇博客是否存在?(hexists)
删除一篇博客如何实现?(hdel)
分布式系统中你登录成功以后是如何存储用户信息的?(hmset)
---------------------> List
1. 相当于LinkList 双向链表 支持正反向查找/遍历 插入删除较快
常常用于热销榜 最新评论等
01 lpush /rpush 在(类似)list集合中的最前面添加/ 最后面添加
lpush mylist "world" lupush mylist "hello" rpush mylist "!!!!"
02 lrange 链表 指定区(0,1)表示1-2元素 负数 -1 表示最后一个 同理可得
lrange mylist 0 -1 上面例子结果 "hello" "world" "!!!"
03 del 删除这个链表结合
04 linsert...before 在key对应的list特定位置之前或之后添加元字符串
05 lset 元素下标 设置list中指定下标的元素值(修改操作)
06 lrem 数字 从list中删除count个和value相同的元素 从头删除n个字段名
例如list中有两个四个hello 2 表示删除两个(前面) 0表示删除全部相同字段
07 Itrim 保留指定的key值范围内的数据
Itrim mylist 1 -1 表示从第二个开始保存 到最后一个
08 lpop 从list头部删除元素 返回删除元素
09 rpop 从list尾部删除元素
10 llen 返回key对应的list长度
11 lindex 返回key在list的位置的元素
12 rpoplpush 从第一个list尾部移出元素添加到第二个list的头部
~~~~> 实战用(面试)
如何基于redis实现一个队列结构?(lpush/rpop)
如何基于redis实现一个栈结构?(lpush/lpop)
如何基于redis实现一个阻塞式队列?(lpush/brpop)
如何实现秒杀活动的公平性?(先进先出-FIFO)
通过list结构实现一个消息队列(顺序)吗?(可以,FIFO->lpush,rpop)
用户注册时的邮件发送功能如何提高其效率?(邮件发送是要调用三方服务,底层通过队列优化其效率,队列一般是list结构)
如何动态更新商品的销量列表?(卖的好的排名靠前一些,linsert)
商家的粉丝列表使用什么结构实现呢?(list结构)
-------------------> Set类型
1. 类似于hashset 是String类型的无序集合 集合成员是唯一的
01 sadd 添加元素 返回0表示添加失败
02 smember 获取内容(字段名)
03 spop 移出并返回集合中的随机元素
04 scard 获取成员个数
05 smove 移动一个元素到另外一个集合
06 sunion 并集 两个集合合并
~~~~> 实战用(面试)
朋友圈的点赞功能你如何实现?(sadd,srem,smembers,scard)
如何实现一个网站投票统计程序?
你知道微博中的关注如何实现吗?
******************** java中的redis应用实践 ******************************
-------->java中的redis应用实践
Gson 概述与下载
a1、Java 解析 Json 最常用的类库有:google 的 Gson、阿里巴巴的 FastJson、
以及 Jackson。这些都是非常优秀而且常用的库。
a2、GSON 是 Google 提供的用来在 Java 对象和 JSON 数据之间进行映射的
Java 类库,可以快速的将一个 Json 字符转成一个 Java 对象,
或者将一个 Java 对象转化为 Json 字符串。
java中使用redis
1. 依赖 spring-boot-starter-data-redis
2. jedis是java操作redis的一个客户端 与jdbc的drivermanager相似,用它
与redis(linux)建立链接
3. 连接池jedisPool应用
JedisPoolConfig config=new JedisPoolConfig();
4. RedisTemplate 应用
为springboot工程中操作数据库的一个java对象 封装一些基本方法
5. 添加yml spring.redis.host:****/port:***
6. StringRedisTemple 专门操作redis字符串数据的对象
7. 定制RedisTemple对象(没深究过)
~~~~~~~~~~~~~> 项目使用场景 <~~~~~~~~~~~~
1. sso单点登录redis中小企业版
2. 投票系统 (基于redis的set类型进行数据存储)
3. 秒杀队列 (先进先出)
4. 分布式id (redis简易版 后面使用发号器springboot工程)
5. 购物车实现 (简易版)
**********************redis数据持久化 Rdb AOF**************************
redis 内存数据库 断电gg 所以需要持久化到磁盘中 定期同步到云储存服务上去
保证数据可靠性,安全性
两种数据持久方案 Rdb和AOF
-*-*-*-*- 1. Rdb 方式持久化 -*-*-*-*-
系统默认开启的数据持久化方式 手动save 阻塞式 bgsave-异步
或周期性保存redis数据
Rdb的方式配置
打开redis.cong文件
save 900 1 # 表示900 秒内如果至少有 1 个 key 的值变化,则触发RDB
save 300 10 # 表示300 秒内如果至少有 10 个 key 的值变化,则触发RDB
save 60 10000 # 表示60 秒内如果至少有 10000 个 key 值变化,则触发RDB
----->实战测试
01 保存几条数据 然后执行shutdown关闭redis 后重启 数据是否消失
***数据不会消失 这个方法是安全退出模式
***redis退出之前会将内存中数据立即生成一份完整的rdb快照
02 清除redis数据和磁盘dump.rdb数据 打开第二个客户端, 存数据后
执行了kill-9 进程号 的操作, 数据是否丢失
***数据会丢失, 模拟redis进程故障 没有进行序列化就被干掉了
03 redis中的save和bgsave有什么不同
***save: 同步操作 当redis实例的所有数据快照以RDB文件的形式保存到硬盘
***bgsave: 命令执行后显示ok 然后出来一个新的子进程
原来的redis进程继续处理客户端请求 而子进程则负责将数据保存到磁盘中,
然后退出.
-*-*-*-*- 2. AOF方式持久化实践 -*-*-*-*-
第一:打开AOF的开关,启用AOF持久化
第二:写入一些数据,观察AOF文件(appendonly.aof)中的日志内容
第三:kill -9杀掉redis进程,重新启动redis进程,发现数据被恢复回来了,
就是从AOF文件中恢复回来的,redis进程启动的时候,直接就会
从appendonly.aof中加载所有的日志,把内存中的数据恢复回来。
aof后台会隔一段时间做一次rewrite操作 日志里的的数据与redis内存数量保持一致
aof优点:
01. 向后台执行fsync操作/s 最多损失一秒数据
02. 日志以append-only模式写入, 性能高 文件易修复(不易破损)
03. 适合作灾难性误删操作 flushall后, 只要没rewrite 立即拷贝aof文件
将最后一条记录flushall删了 在放回去 然后等待自动恢复即可
aof缺点:
01. 日志文件比rdb文件大
02. 基于日志的方式脆弱一些,容易有bug,所以基于内存中的数据
进行指令的重新构建
`````````` 如何选择redis持久化方案
01. Rdb+AOF组合使用,aof保证数据不丢失 用rdb做不同程度的冷备
//*****redis 事务处理实践 */
1.采用乐观锁进行事务控制 watch命令监视给定的key, 当exec(提交事务后)
监视的key发生变化,则整个事务失败.连接断开监视 事务会被自动清除
2. 基本指令:
01. multi: 开启事务
02. exec: 提交事务
03. discard取消事务
04. watch 监控 只要监视的key反生变化 就取消事务
05. unwatch 去掉监控
exec后所有命令需要执行 如果中途断线 没关系 redis记录了所有要执行的命令
注意: redis没有回滚操作,只有取消事务
项目: 秒杀抢票的事务处理(模拟)
---------------------redis高级特性---------
01 redis主从复制
一主三从 master-->slave
02 哨兵模式:
主从架构模式下 实现高可用的一种机制.
由一个或多个sentinel实例组成的sentinel系统可以监视任意多个主服务器
以及这些主服务器属下的所有从服务器. 当一个被监视的主服务器进入下线状态时候
自动选举一个新的主服务 新的代替旧的进行处理命令请求
工作原理:
01 sentinel以1/s的频率向它所知的Master,salve以及其他sentinel发送一个ping值
02. 如果30秒没有接收到ping值 则会标记为主观下线
03. 如果一个master被标记为主观下线,则正在监视在这个Master的所有sentinel
要以每秒一次的频率确认master是否下线
04. 大于配置文件指定的sentinel在规定时间范围确定master主观下线 则被标记
客观下线
05. info命令(sentinel-->master)10秒一次==>1秒一次
06. 如果没有足够的数量统一master下线 客观下线状态移出
07. master重新发送有效恢复, 主观下线状态移出
redis高并发与整个系统高并发的关系