首页IT科技redis视频教程看谁的比较好(redis知识点笔记)

redis视频教程看谁的比较好(redis知识点笔记)

时间2025-06-14 08:23:36分类IT科技浏览4352
导读:Redis相关复习 知识点...

Redis相关复习 知识点

相关知识点简介

1 为什么要使用redis(说redis优点)?

2 使用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的特点:

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

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

Redis支持数据的备份                  ,即master-slave模式的数据备份                  。

支持事务

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

2 . 使用redis有什么缺点

一共是四个问题

缓存和数据库双写一致性问题

缓存雪崩问题

缓存击穿问题

缓存的并发竞争问题

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

这个问题是对redis内部机制的一个考察,主要是三个点

redis纯内存操作

单线程操作            ,避免了频繁的上下文和线程切换                  ,只去处理简单的sql语句      ,不处理io操作

采用了非阻塞I/O多路复用机制

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

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

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

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

快递员之间的协调很花时间(多个线程每次执行之前都抢这一个锁            ,浪费时间)

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

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

Redis的优势:

性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s       。

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

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

丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性      。

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

五种类型与类比java的模型

string --> String

hash --> Hashmap

list --> LinkList

set --> HashSet

sorted_set --> TreeSet

二 .五大基本数据类型

1 .String类型语句

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

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 //自减1decrby 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 不存在或为空列表            ,返回 0linsert key BEFORE|AFTER 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] timeoutbrpop 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数据库

@Autowiredprivate RedisTemplate redisTemplate;​@Testvoid set() { ValueOperations ops = redisTemplate.opsForValue(); //ops后面可以用各种类型的属性 opsForValue是String类型 ops.set("age",20);}​@Testvoid 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")); }

创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

展开全文READ MORE
病毒和间谍软件定义已过期(Windows10 提示“病毒和间谍软件定义更新失败”?) SEO基础优化技巧大揭秘(掌握这些技巧,让你的网站排名一路飙升)