学习Redis

Redis使用场景

数据类型

String

常常用来做计算器 ,比如文章的阅读量,关注数,锁

计数:set {uid}:{articleId}:{views} 0               #设初始值为0
           incrby {uid}:{articleId}:{views} 1        #每次阅读键值 +1
           decr {uid}:{articleId}:{views} 1           #每次阅读 -1

           get {uid}:{articleId}:{views}                #获取该文章的阅读数量

锁:setnx key value:
       当键不存在时,对键进行设置操作并返回成功1,否则返回失败0。
       Key是锁的唯一标识,一般按业务来决定命名;
       Value 往往用来比较加锁的是哪一个线程或者哪一个消息,
       一般使用UUID.randomUUID().toString()方法生成。
      例如:setnx(key,1),一般建议将锁的过期时间设置为业务处理时间的一半以上

List(列表)

在redis里面,可以把list玩成,栈(一端开口,一端闭口,先进后出)、队列(一端进,一端出,先进先出lpush,rpop)、阻塞队列(两端都可以进出)!
list可以用来做消息队列(代替mq)

Set(无序非重复集合)

常用交集做共同关注,推荐好友

Hash(哈希)

map集合,key-map!值是一个map,hash更适合存储对象,可以做分布式锁

Zset(有序集合)

可以用zset做排序:

存储班级成绩表,工资表排序!

普通消息,1,重要消息2,带权重进行判断!
排行榜应用实现!

geospatial( 地理空间)

  • geoadd:添加地理位置的坐标。
  • geopos:获取地理位置的坐标。
  • geodist:计算两个位置之间的距离。
  • georadius:根据用户给定的经纬度坐标来获取指定范围内的地理位置集合。
  • georadiusbymember:根据储存在位置集合里面的某个地点获取指定范围内的地理位置集合。
  • geohash:返回一个或多个位置对象的 geohash 值。

get的底层实现是zset,可以用做 朋友的定位,计算两地之间的距离,附近的人

Hyperloglog (基数)

  1. pfadd key element [element ...]:将一个或多个元素添加到指定的 HyperLogLog 数据结构中
  2. pfcount key [key ...]:获取一个或多个 HyperLogLog 数据结构的基数估计值。
  3. pfmerge destkey sourcekey [sourcekey ...]:将一个或多个 HyperLogLog 数据结构合并成一个。合并后的 HyperLogLog 的基数估计值是所有指定 HyperLogLog 的基数估计值之和。

用做不重复的统计,如果允许容错,那么一定可以使用Hyperloglog !
如果不允许容错,就使用set或者自己的数据类型即可!

Bitmaps(位存储)

  • setbit key offset value:将指定偏移量的位值设置为value。
  • getbit key offset:获取指定偏移量的位值。
  • bitcount key [start end]:计算指定偏移量以上的二进制位中值为1的个数。
  • bitop[l] [command destkey key [key ...]]:执行多个Redis命令,其中command为BITOP命令,destkey为目标键名,key为源键名,可以传入多个键名。

常用做统计用户信息,活跃,不活跃!登录、未登录!打卡,365打卡!两个状态的,都可以使用Bitmaps !Bitmaps位图,数据结构!都是操作二进制位来进行记录,就只有0和1两个状态!
365天= 365 bit1字节= 8bit46个字节左右!

Redis 事务

一组命令中如果右一条命令的语法错误,那么所有的命令都会失败;如果是命令的语法正确,但是逻辑错误(比如给字符串自增),那么其他正确的命令依然能执行成功,这点和MySQL不同

Redis乐观锁

监控!(Watch)
悲观锁:
        很悲观,认为什么时候都会出问题,无论做什么都会加锁!(安全,但性能低)
乐观锁∶
        很乐观,认为什么时候都不会出问题,所以不会上锁!更新数据的时候去判断一下,在此期间是否有人修改过这个数据,在MySQL中用version来判断(获取version,然后比较)

watch money 监视money,给money加锁并获取money 值,跟新时会比较money的值是否变化,如果变化,事务执行失败。

持久化RDB

Redis是内存数据库﹐如果不将内存中的数据库状态保存到磁盘,那么一旦服务器进程退出,服务器中的数据库状态也会消失。所以Redis提供了持久化功能!


1、save的规则满足的情况下,会自动触发rdb规则

2、执行flushall命令,也会触发我们的rdb规则!

3、退出redis,也会产生rdb 文件! 备份就自动生成一个dump.rdb

  

  1. 开始bgsave: 当执行bgsave命令时,主进程会fork出一个子进程。这个子进程在初始阶段会共享主进程的内存数据。
  2. 读取内存数据: 完成fork之后,子进程会开始读取主进程的内存数据。这是通过读取共享内存实现的,也就是主进程执行读操作的时候。
  3. 写入RDB文件: 子进程将读取到的内存数据写入新的RDB文件。
  4. 替换旧文件: 最后,子进程会将新的RDB文件替换旧的RDB文件。

关于copy-on-write技术:

这种技术是实现持久化的关键。在fork主进程得到子进程这一过程中,实际上是使用了写时复制(copy-on-write,简称COW)技术。

  1. 当主进程执行读操作时: 写时复制技术允许主进程和子进程共享相同的物理内存页,直到有写操作发生改变页内容时,才会复制一份新的页。因此,当主进程执行读操作时,它会直接访问共享的内存,无需创建新的副本。
  2. 当主进程执行写操作时: 如果主进程执行写操作,改变了某个页的内容,那么这个页就会被复制出来一份新的页,这个新的页会被标记为只写(write-only)。然后,主进程和子进程都会使用这个新的只写页。这样做的目的是为了确保在发生写操作时,不会影响到其他进程的内存页。

AOF(追加文件)

Redis发布订阅

可以用redis的发布订阅功能简单的做 :

1.实时消息系统

2.实时聊天室(频道当做聊天室,将信息回显给所有人即可)

3.订阅、关注都是可以的
但是稍微复杂的场景会使用 消息中间件 MQ

Redis主从

******主节点可以读写,从节点只能读******(读写分离)

配置主从关系:

在redis.conf文件中设置bind属性值来允许连接的 IP

在slaveof中配置:

Redis哨兵

哨兵的作用和原理

搭建哨兵集群

# 端口号设置为27001  
port 27001  
  
# 宣布主服务器的IP地址为192.168.150.101  
sentinel announce-ip 192.168.150.101  
  
# 监视主服务器mymaster,IP地址为192.168.150.101,端口号为7001,权重为2  
sentinel monitor mymaster 192.168.150.101 7001 2  
  
# 当主服务器mymaster不可用时,如果在5000毫秒内仍然不可用,则认为主服务器已下线  
sentinel down-after-milliseconds mymaster 5000  
  
# 当主服务器mymaster发生故障时,如果在60000毫秒内仍然无法进行故障转移,则认为故障转移失败  
sentinel failover-timeout mymaster 60000  
  
# 数据目录设置为"/tmp/s1"  
dir " /tmp/s1"

要运行多少个sentinel 实例就创建多少个目录,并创建sentinel.conf文件

启动sentinel 实例的命令 ; (类似DockerCompose)

redis-sentinel /path/to/your/sentinel.conf

RedisTemplate的哨兵模式

Redis分片集群

搭建分片集群

假设一主已从,3个主就需要6个redis服务,在6个目录分别创建redis.conf文件
配置reids.conf文件:

1 port 6379          # 设置Redis监听的端口号为6379(其他目录要去修改)
2 cluster-enabled yes # 开启集群功能
3 cluster-config-file /tmp/6379/nodes.conf # 集群的配置文件名称,不需要我们创建,由redis自己维护
4 cluster-node-timeout 5000 # 节点心跳失败的超时时间
5 dir /tmp/6379 # 持久化数据存放目录
6 bind 0.0.0.0 # 绑定地址,设置为0.0.0.0表示允许所有IP访问
7 daemonize yes # Redis后台运行
8 replica-announce-ip 192.168.150.10 # 设置主节点IP地址
9 protected-mode no # 关闭保护模式,不用设置密码
10 databases 1 # 设置数据库数量为1个
11 Logfile /tmp/6379/run.log # 日志文件路径
redis-server path/redis.conf    #按照path/redis.conf的配置启动redis服务

这6个redis服务还没有任何联系,所有建立联系:

散列插槽

如果要连接redis来测试一定要加 -c 参数,表示集群模式连接:

[root@localhost tmp]# redis-cli -c -p 7001

集群伸缩

故障转移

RedisTemplate访问分片集群

Redis最佳实战

Redis键值设计

键命名

BigKey

选择数据类型当key

批处理优化

也可以使用RedisTemlate管道技术

服务端优化

集群最佳实践

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值