Redis命令

//-------- 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高并发与整个系统高并发的关系

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值