Redis学习笔记

Reids学习笔记

1、获取Redis资源

wget http://download.redis.io/releases/redis-5.0.5.tar.gz

2、安装
cd redis-5.0.5.tar.gz
make
配置软连接,以便后期方便启动Redis:
   ln -s /usr/local/redis-5.0.5/src/redis /usr/bin/redis  #服务端
   ln -s /usr/local/redis-5.0.5/src/redis-cli /usr/bin/redis-cli  #客户端
3、将redis加入到开机启动

vi /etc/rc.local //在里面添加内容:/usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf (意思就是开机调用这段开启redis的命令)

4、开启Redis
redis redis.conf  (redis redis.conf的目录)
5、配置Redis客户端链接密码 在这里插入图片描述
6、Redis-cli参数意义
 	--raw  #防止中文乱码 
 	-a "password" #带密码登陆
 	-p 6379  #连接端口
 	-h 127.0.0.1 #连接IP
	-r #命令执行多次 eg: redis-cli -r 3 ping  将执行三次ping操作
	-i #多与 '-r' 连用,表示每隔几秒执行一次;只支持s,如需ms应换算成 *.**
	-x #echo "world" | redis-cli -x set hello 选项代表从标准输入(stdin)读取数据作为redis-cli的***一个参数
	--slave #个人理解为多客户端同步数据,还请自查资料
	--scan & --pattern #用于扫描指定模式的键
	--rdb #请求Redis实例生成并发送RDB持久化文件,保存本地。可用于定期持久化文件备份
7、数据类型以及语法
string(字符串): 
	SET runoob "测试string"  
	GET runoob
	SETRANGE runoob 0 ** #替换指定位置的字符串为**
	GETRANGE runoob 0 5 #获取当前runoob的0-5之间的子字符   0 —— -1查询所有字符串
	SET runoob
	DECR runoob 		#将 key 中储存的数字值减一
	INCR runoob 		#自增1
	getset key **  		#先获取key值再set新值,下次获取为新值
hash(哈希)-->map
	HSET hashk hk hv    #插入数据
	HGET hashk field1 
	HMSET hashk field1 "Hello" field2 "World"  
	HMGET hashk field1 field2
	HDEL hashk	hk1		#如有使用的key 则需要删除
	HGETALL hashk 		#获取所有的元素
	HLEN hashk 			#获取hash的长度
	HEXISTS hashk hk1	#判断key是否存在
	HKEYS hashk #只获取所有的field
	HVALS hashk #只获取所有的value
	HINCRBY hashk hk1 1 #将hk1的value的值增1
	HSETNX hashk hk1 hv1 #如果hk1存在可设置hv1,不存在则不能设置
list(有序集合)倒叙:先插入的下表最大:
	lpush listK listV1 	#左插入
	rpush listK listV2 	#右插入
	lpop listk  		#移除最左侧一个元素
	rpop listk  		#移除最右侧一个元素
	lrang listK 0 10 	#获取去区间值
    lindex listk 1 		#通过下标获取元素
    llen listk 			#获取list的长度
    lrem listk * 		#移除指定的元素
    ltrim listk 0 2      #截取指定长度
    rpoplpush listk nlistk #将listk的最后一个元素移动到nlistk中
    lset listk 0 nval    #将对应下标的值更新为nval,不存在报错
    linsert listk after/before existsV nVal #将nVal值插入到listk中existsV值的前/后
set(无序集合):
	sadd setK setV1  	#添加成功返回1,已存在则返回0
	smembers setk       #查看set中的所有元素
	smembers setk setV1 #判断某元素是否存在于set
	scard setk    		#获取set集合的所有元素
	srandmember setk     #随机输出一个元素
	spop setk 			#随机移除元素
	smove setk setk2 "val" #将指定的值移动到另一个set集合中
zset(sorted set:有序集合):
	zadd zsetk k zsetV1 # 可根据k排序
	zrange zsetK 0 2  	#获取当前zsetK的0-2之间的子字符
	zrangebyscore zsetk -inf +inf # 从小到大排序展示
	zrem zsetk zk       #移除指定元素
	zcard zset          #获取zset的数量
	zrevrange zset 0 -1 #从大到小进行排序
	zcount zsetk   0 3     #获取指定区间setk的成员数量
8、Redis Keys命令
del key #删除key
dump key #返回序列化的key eg:set  yog 3被序列化后"\x00\xc0\x03\t\x00\xe1h\xa1\xbe\x85\x03\x0f\x8e"
exists key #判断key是否存在
expire key 10 #设置key的有效期为10s
expireat key 1293840000 #与expireat的区别在于expireat接受时间戳
pexpire key milliseconds #接受毫秒级时间戳
move key *db  #将当前key移动到 *db库中
persist key #取消当前key的过期时间
ttl key #返回当前key的剩余生存时间
rename key newName #为当前key设置新的name
type key #返回当前key的类型
8、benchmark 压测命令:
9、基础操作
keys *   查看所有key
FLUSHALL 清空全部数据库内容
flushdb  清空当前库的所有key
10、三种特殊的数据类型
a、geospatial地理位置

1、在Redis3.2版本出现 应用场景:朋友定位、附近的人、距离计算

2、常用命令:

geoadd  city 116.405 39.900 beijing   #添加地理位置
geodist city beijing chongqing m/km/mi/ft #获取两城市的直线距离
geohash city veijing chongqing #将二维的经纬度转换成一维的字符串,两字符串越近,实际位置越相近
geopos city beijing chongqing #获取指定的城市地理位置
georadius city 104.34 30 1000 km   #查询指定地理位置为中心的方圆1000km内的城市
georadiusbymember city beijing 1000 km #找出指定元素周围的其他元素
b、Hyperloglog 基数统计

1、什么是基数 : A { 2,3,5,6} B{1,3,5,6,7} 基数(不重复的数据) =5 可接受误差

2、优点: 占用的内存固定,2^64不同的元素的技术,只需要使用12k的内存,从内存角度来比较Hyperloglog优先。

3、常用命令:

pfadd key1  a a b c d e f #创建一组元素
pfcount key1 #统计key1的基数数量 当前实例为7
c、Bitmap 位存储

1、应用场景:统计用户信息:活跃不活跃 打卡未打卡等

2、常用命令:

setbit sign 0 0/1   #设置当天状态
getbit sign 0 		#查看当天状态
bitcount sign       #统计总的状态

11、trancations事务

Redis单条命令保证原子性,但事务不保证;Redis事务也没有隔离级别的概念

1、Redis事务本质:一组命令的集合,一个事务中的所有命令都会被序列化,在事务执行过程中,会按照顺序执行!

2、redis的事务执行顺序:

* 开启事务(multi) 
* 命令入队
* 执行事务(exec)
* 放弃事务(discard)

在这里插入图片描述

3、运行时异常

4、监控

​ 悲观锁:无论何时都要加锁,影响性能。

​ 乐观锁:认为何时都不会出现问题,所以不会上锁,更新数据时会判断期间是否有人修改过数据。

12、Jedis redis官方推荐java连接开发工具

在这里插入图片描述

13、与SpringBoot整合

说明:在springBoot2.X之后,jedis被替换成lettuce

jedis: 采用直连,多个线程操作的话,是不安全的,如果想要避免不安全的,使用jedis pool连接池,更像BIO模式。
lettuce:采用netty,实例可以在多个线程中进行共享,不存在线程不安全的情况,可以减少线程数据,更像NIO模式。

1、添加pom依赖: spring-boot-starter-data-redis

2、编辑配置类application.properties

自动配置类:RedisAutoConfiguration、Reids模板类:Redistemplate

spring.redis.host=127.0.0.1
spring.redis.port=16379
spring.redis.lettuce.pool=*** #集群连接池

在这里插入图片描述

3、自定义RedisTemplate类
在这里插入图片描述

14、redis.conf配置文件详解

网络

通用

快照

限制

15、Redis持久化

​ 1、rdb

​ 2、AOF: 以日志文件形式来记录每个操作(记录写指令,不记录读指令);只允许追加文件不能修改文件;Redis重启后会读取文件重新将数据读入内存,完成数据的恢复工作。

* 默认是不开启的,只需要修改配置appendonly yes即可开启;重启redis即可生成appendonly.aof文件。
  1. 当appendonly.aof文件异常是不能启动redis的,可使用redis-check-aof --fix 进行修复。

    优缺点:

    优: 
    	1、每一次修改都会同步,文件完整性更好。
    	2、每一秒同步一次,可能会失去这一秒的数据。
    	3、从不同步,效率高。
    缺: 
    	1、由于是文件存储,占用磁盘远大于rdb,修复速度也比rdb更慢。
    	2、aof运行效率也要比rdb慢,so 我们redis默认的配置就是rdb持久化。
    
16、发布订阅

发布订阅(pub/sub)是一种消息通信模式。
在这里插入图片描述

测试

常用命令
在这里插入图片描述

订阅
在这里插入图片描述
发布
在这里插入图片描述

17、主从复制

主从复制是单向数据的复制,只能由主节点到从节点;默认情况下每台redis服务器都是主节点,并且每台主节点可有多个子节点,但是一个子节点只能有一个主节点。

主从复制的作用:

1、数据冗余:主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式。
2、故障恢复:当主节点出现问题时,可以由从节点提供服务,实现快速的故障恢复;实际上是一种服务的冗余。
3、负载均衡:在主从复制的基础上,配合读写分离,可以由主节点提供服务,由子节点提供读服务,分担服务器压力,可大大提高redis的并发量。
4、高可用基石:主从复制还是哨兵和集群能够实施的基础,因此说主从复制是redis高可用的基础。

搭建主从复制环境:

临时生效命令:
	SLAVEOF 127.0.0.1 16379  #认主节点
	info replication	 #查看主从关系
永久生效须通过配置文件配置。

注意事项:

当master节点宕机后slave节点依然链接主节点,只是不能进行写操作,依然可读取存量数据,master节点重启后写入的数据,会继续同步到slave节点中。
​当slave首次启动成功并连接到master后就会发送一次sync同步操作;如遇到slave异常宕机等异常后重启、配置master后就会触发一次自动全量复制操作,在slave中可查询到master中的数据。
​M <---- S-M <---- S 模式下:当M 宕机、关闭时,S-M任然没有写入权限,只有S-M通过手动执行 slaveof no one 谋权篡位后才能有写权限,当M 再次启动回归其下的slave节点就不存在啦。
18、哨兵模式

哨兵模式:

配置哨兵配置文件:

sentinel monitor redisM 127.0.0.1 16379 1   #配置被监听的redis  1为票数,票数最高的会成为主节点。(有一定延时)
redis-sentinel sentinel.conf #启动哨兵模式  

注意:当前master节点死掉,哨兵模式指定选取新的master节点;当死掉的master节点重启后,哨兵模式会自动将其配置成slave节点。

优缺点:

y:
	1、哨兵集群,基于主从复制模式,所有节点的主从复制的优点他都有。
	2、主从可以切换,故障可以转移,系统的可用性更好。
	3、哨兵模式就是主从复制的升级版,由手动到自动。
q:
	1、主从切换有延时性,不能保证数据完整性。
	2、实现哨兵模式配置比较麻烦。
	3、redis不好在线扩容,集群容量一旦达到上限,扩容十分麻烦。
19、Redis缓存穿透和雪崩

缓存穿透概念

​ 当用户想要查询一个数据时,在redis内存数据库中没有,也就是缓存没有命中,于是向持久化层数据库查询,发现也没有于是本次查询失败。当出现很多用户时,缓存都没有命中,于是都去请求了持久层数据库。这会给持久层数据库造成很大压力,这时就相当于出现缓存穿透。

解决方案: 布隆过滤器、缓存空对象

缓存击穿概念:

​ 缓存击穿是指一个key十分热点,在不停的扛着大并发,大并发集中对这个点进行访问,当这个key在失效的瞬间,持续的大并发就会击穿缓存,直接请求持久层数据库,就行屏障被凿开一个洞。

​ 当key在过期瞬间,有大量的并发请求访问,这类数据一般是热点数据,由于缓存过期,会同时访问数据库来查询最新数据,并且会写缓存,会导致数据库瞬间压力过大。

解决方案:

1、设置热点数据永不过期

2、添加互斥锁:使用分布式锁,保障对于每个key同时只有一个线程去查询后台服务,其他的线程没有获取分布式锁的期限,因此只需要等待即可。这种方式将高并发的压力转移到分布式锁,因此对分布式锁的考验很大。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值