redis知识点笔记(redis相关知识)

  本篇文章为你整理了redis知识点笔记(redis相关知识)的详细内容,包含有redis基本知识 redis相关知识 redis知识点思维导图 redis笔记整理 redis知识点笔记,希望能帮助你了解 redis知识点笔记。

  3 单线程的redis为什么这么快?

  4 redis的数据类型,以及每种数据类型的使用场景

  5 redis的过期策略以及内存淘汰机制

  6 redis和数据库双写一致性问题

  7 如何应对缓存穿透和缓存雪崩问题

  8 如何解决redis的并发竞争问题

  

  1 为什么要使用redis?

  在项目中使用redis,主要是从两个角度去考虑:性能和并发,redis还具备可以做分布式锁等其他的功能,但是如果只是为了使用分布式锁这些功能,还可以使用其它中间件来代替(如zookpeer等),并不是非要去使用redis。

  

  
一. 性能:当我们碰到执行耗时很长时间,而且结果不频繁变动的SQL语句,就特别适合将运行结果放入缓存数据库里面,这样一来,后面的请求就全部去缓存里面读取,使得请求可以快速响应 (Tips:sql运行时间越短越好,用缓存是最快的方式)

  
二. 并发:在数据量很大的时候,所有的请求直接访问数据库,mysql数据库的压力会特别大(mysql数据库并发很小) 然后就会崩溃。

  
这个时候,就需要使用redis数据库进行一个中间缓存的操作,让请求先去访问reids,而不是去直接访问mysql (请求过来之后首先先去redis数据库里面查数据,redis里面没有再去mysql里面查,查到之后放到redis里面一份),这样以来,redis解决了大部分的访问问题,mysql数据库的压力就会小很多

  
内存数据库,速度快,也支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。

  
Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。

  


命令行启动redis的方法首先windows +r 输入cmd 打开黑窗口输入 redis-server //第一步启动客户端
​
然后另起一个黑窗口输入redis-cli -h 数据库ip //第二步启动服务端
​
然后输入密码 即可 //输入密码
​
ctrl + l 清屏

 

  

  2 . 使用redis有什么缺点

  一共是四个问题

  
题外话:我们现在要仔细的说一说I/O多路复用机制,因为这个说法实在是太通俗了,通俗到一般人都不懂是什么意思。举一个例子:张三在家开了一家快递店,负责同城快送服务。张三因为资金限制,雇佣了一批快递员(线程),然后张三发现资金不够了,只够买一辆车送快递(只能每次执行一个操作,车代表CPU核数)。

  经营方式一 客户每送来一份快递,张三就让一个快递员盯着,然后快递员开车去送快递。慢慢的张三就发现了这种经营方式存在下述问题

  
几十个快递员基本上时间都花在了抢车上了,大部分快递员都处在闲置状态,谁抢到了车,谁就能去送快递(多个线程抢占线程锁,很多线程都是空闲)

  
随着快递的增多,快递员也越来越多,张三发现快递店里越来越挤,没办法雇佣新的快递员了

  
经营方式二 改善之后,小曲只雇佣一个快递员(单线程)。然后呢,客户送来的快递,小曲按送达地点标注好,然后依次放在一个地方。最后,那个快递员依次的去取快递,一次拿一个,然后开着车去送快递,送好了就回来拿下一个快递(一次执行一个操作,执行完成之后执行其他的)。

  

  总结:经营方式一就是传统的并发模型,每个I/O流(快递)都有一个新的线程(快递员)管理。 经营方式二就是I/O多路复用。只有单个线程(一个快递员),通过跟踪每个I/O流的状态(每个快递的送达地点),来管理多个I/O流。

  

  

  

  

  Redis的优势:

  
丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。

  
原子性 – Redis的所有操作都是原子性的,同时Redis还支持对几个操作合并后的原子性执行。(事务)

  
 

  redis所有的操作都是原子性的,采用单线程处理所有业务,命令是一个一个执行的,因此无需考虑并发带来的数据影响

  

  五种类型与类比java的模型

  
(典型应用场景: • 通用缓存、计数器(下载量、点击量、在线人数等)等)

   IO优化:合理使用mget、mset、pipeline等多值命令,提高批量操作的效率

  • 命令处理时间通常小于网络传输时间,减少网络开销的次数将会极大提高操作效率

  • 批量操作的命令/KEY数量一次不易过多,否则会出现Redis处理阻塞或者网络延迟

  • 不要将所有数据都放到Redis内存中,只放热数据和有用的数据**

  • 长字符串尽量压缩存储,控制在512字节以内**

  

String作为数值操作时的注意事项
string在redis内部存储默认就是一个字符串,当遇到增减类操作incr,decr时会转成数值型进行计算
redis所有的操作都是原子性的,采用单线程处理所有业务,命令是一个一个执行的,因此无需考虑并发带来的数据影响。
按数值进行操作的数据,如果原始数据不能转成数值,或超过了redis数值上线范围,将会报错。9223372036854775807 (java中long型数据最大值,Long.MAX_VALUE)

 

  

  

//spring语法格式
​
//添加/修改数据
set key value
​
//获取数据
get key
​
//删除数据
del key
​
//设置一个有过期时间的键 
set key value [ex 过期时间单位:秒] [px 过期时间单位:毫秒] //ex跟px之间设置一个就可以了

//设置一个string类型的name,它的过期时间是20秒 
set name zhangsan ex 20 

//查看key的过期时间 
ttl key 

//删除过期时间的设置 
persist key 
//也可以通过重新设置值 但是不加过期时间的方式来取消过期时间 


//添加/修改多个数据语法格式
mset key1 value key2 value2 …

//获取多个数据
mget key1 key2 …

//追加数据到值的尾部
append key value 

//获取数据字符个数(字符串长度)
strlen key 

 -------------------------- 
//设置数值数据增加指定范围的值
//key的值自增+1 
incr key 

//key增加指定的数值 incrby age 10 
incrby key increment

//增加一个浮点数(小数)
incrbyfloat key increment 


//设置数值数据减少指定范围的值
decr key //自减1
decrby key increment //减少指定数值 

//清屏
 clear 

 

  

  

  2. Hash(哈希)

  相当于比string类型多了个对象,可以多个键值对存放在一个对象里面,这就叫做hash

  Ø 类型说明:

   哈希类型所存储的键值本身又是一个键值对结构!

  Ø 典型应用场景:

   对象信息,比如用户基础信息、商品信息等

  对象类数据的存储如果具有较为频繁的更新需求,操作会显得笨重,存容易,改麻烦。 为了区别与Redis中的键值对的称呼,hash中的键成为field,而key特征Redis的键。

  

  hash类型数据操作的注意事项

   单个hash类型成员个数不要过多

   hgetAll获取所有成员谨慎使用,容易带来性能问题(hscan)

  hash类型下的value只能存储字符串,不允许存储其他类型数据,不存在嵌套现象。如果数据未获取到,对应的值为(nil) 每个hash可以存储2的32次方-1个键值对

  hash类型十分贴近对象的数据存储形式,并且可以灵活添加删除对象属性。但hash设计不是为了存储大量对象的,切记不可滥用,更不可以将hash作为对象列表使用 hgetAll操作可以获取全部属性,如果内部fiekd过多,遍历整体数据效率就会很低,有可能成为数据访问瓶颈。

  

//Hash基本操作
​
//添加/修改数据 对象 属性 值
hset key field value // hset user name zhangsan
​
//获取数据
hget key field // hget user name 

//根据key删除数据
hdel key field1 [field2] 
// hdel user name 

//根据对象名获取所有键值对 
hgetall key 

//添加/修改多个数据
hmset key field1 value1 field2 calue2 
// hmset user name zhangsan age 15 //user 里面设置了两个键值对 name和age
​
//获取多个数据
hmget key field1 field2 … 
// hmget user name age //获取user中的name和age的值

//获取哈希表中字段的数量
hlen key 
​
//获取哈希表中是否存在指定的字段
hexists key field 
//hexists user name 看user中有没有name字段

//获取哈希表中所有的字段名和字段值
hkeys key //字段名 获取所有键
hvals key //字段值 获取所有值 

 

  

  3 . list 类型

  数据存储需求:存储多个数据,并对数据进入存储空间的顺序进行区分 需要的存储数据:一个存储空间保存多个数据,且通过数据可以体现进入顺序 list类型:保存多个数据,底层使用双向链表存储结构实现

  lpush rpop 队列先进先出(队列像排队一样谁在前面谁先出去)

  栈是先进后出(栈像一个水瓶一样,先进来的最后才能出去)

  

//-----------添加/修改/查询数据----------------

//从list的左边添加进来 
lpush key value1 [value2] … 
//lpush student zhangsan lisi 
​
//从list的右边添加进来 
rpush key value1 [value2] …

//将值 value 插入到列表 key 当中,位于值 pivot 之前或之后。 如果命令执行成功,返回插入操作完成之后,列表的长度。 如果没有找到指定元素 ,返回 -1 。 如果 key 不存在或为空列表,返回 0
linsert key BEFOREAFTER pivot value 
// linsert student before xiaoli zhangsan 在xiaoli前面添加一个值zhangsan
​

//获取从lilst左数第start到stop个元素,从0开始
lrange key start stop 
//lrange student 0 3 获取student中0到3的值
​
//查询第i个元素 
lindex key index 

//获取指定list的长度 
llen key

//规定时间内获取并移除数据 blpop是从左边移除数据 brpop是从右边移除数据
blpop key1 [key2] timeout
brpop key1 [key2] timeout
//阻塞式获取,在规定时间内获取这个值,规定时间内如果还没有的时候可以等,直到有值就可以获取到获取超时获取为空. 比如说现在设置了获取超时时间是30秒,30秒内只要其他客户端通过 lpush 添加进来数据就可以获取到并删除
//开两个客户端,一个设置15s内获取list1中的值,此时list1位空一直等待(阻塞),在15秒内另一个客户端存入到list1中数据,此时就被获取到。 



//-----------获取并移除数据-----------------

//获取并删除list左边第一个元素 
lpop key

//获取并删除list右边第一个元素 
rpop key 

//移除指定数据 count为移除的数量,value为移除哪个值
lrem key count value 
​

 

  

  

  4 . Set类型

  新的存储需求:存储大量的数据,在查询方面提供更高的效率 需要的存储结构:能够保存大量的数据,高校的内部存储机制,便于查询 set类型:与hash存储结构完全相同,仅存储键,不存储值(nil),并且值是不允许重复的。也就是只有键没有值的hash Set的基本操作

  set类型不允许数据重复,如果添加的数据在set中已经存在,将只保留一份 set虽然与hash的存储结构相同,但是无法启用hash中存储值的空间

  

//-----------添加数据-----------(可以同时添加多个值,用空格分开)
sadd key menber1 [member2]
//sadd 集合名 数据1... 
​
//获取全部数据
smembers key
//smembers 集合名
​
//删除指定的数据
srem key member1 [member2]
//srem 集合名 数据 
​
//获取集合数据总量
scard key
​
//判断集合中是否包含指定数据
sismember key member


 ---------------------------------------------------------------------------------- 
 //业务场景-随机操作数据
//每位用户首次使用进入头条时候会设置3项爱好的内容,但是后期为了增加用户的活跃度,兴趣点,必须让用户对其他信息类别逐渐产生兴趣,增加客户留存度,如何实现? 使用set的集合随机获取就可以
​
//业务分析
//系统分析出各个分类的最新或最热点信息条目并组织成set集合,随机挑选其中部分信息
//配合用户关注的信息分类中的热点信息放一块的全部信息集合 

​
//随机获取集合中指定数量的数据
srandmember key [count] 
//srandmember 集合名 数量

//随机获取集合中指定数量的数据(如果不指定数量的话就可以像随机数一样)
srandmember key [count]

​
//随机获取集合中的某个数据并将该数据移出集合
spop key 



//---------求两个集合的交、并、差集-----------

//求两个集合的交集 (比如找两个人共同的好友)
sinter key1 [key2] //sinter 集合一 集合二

//求两个集合的并集 (两个人全部的好友)
sunion key1 [key2] 

//求两个集合的差集(key1有但是key2没有的) 
sdiff key1 [key2] 



//将指定数据从原始集合移动到目标集合中
smove source destination member 
//smove 集合1 集合2 从集合1到集合2移动的数据 

 

  

  

  SpringBoot整合Redis

  1 .首先导入redis对应的starter

  

 dependency 
 groupId org.springframework.boot /groupId 
 artifactId spring-boot-starter-data-redis /artifactId 
 /dependency 

 

  2 接下来配置,在application.yml配置文件里面加redis的数据源相关配置 url username password等

  

  3 最后提供 注入redis接口对象RedisTemplate,通过Redisemplate操作redis数据库

  

@Autowired
private RedisTemplate redisTemplate;
​
@Test
void set() {
 ValueOperations ops = redisTemplate.opsForValue(); //ops后面可以用各种类型的属性 opsForValue是String类型
 ops.set("age",20);
}
​
@Test
void get() {
 ValueOperations ops = redisTemplate.opsForValue();
 System.out.println(ops.get("age"));
}
​
​
 //所有的Set设置
 @Test
 void AllSet() {
 stringRedisTemplate.opsForValue().set("love", "pig"); //设置String类型
 stringRedisTemplate.opsForSet().add("map","张三","李四","王五"); //设置set集合类型
 }
​
 //所有的Get获取
 @Test
 void AllGet() {
 System.out.println(stringRedisTemplate.opsForValue().get("name"));
 System.out.println(stringRedisTemplate.opsForHash().get("eat", "fruit"));
 }

 

  

  

  以上就是redis知识点笔记(redis相关知识)的详细内容,想要了解更多 redis知识点笔记的内容,请持续关注盛行IT软件开发工作室。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: