redis知识总结(基础篇,可复习,可学习)
时间:2022-11-02 23:30:00
最近redis我几乎看完了,忘记了很多以前学过的东西,所以我篇博客复习复习。本文介绍了redis回头会继续更新基继续更新,同时,我也希望这篇文章能对所有的老板有所帮助。
如果这篇拙作有什么不准确或者有什么不对劲,请给我一些建议。首先感谢大佬们的支持。
文章目录
- redis是什么
- SQL和NoSQL的区别
- NoSQL和SQL的对比
- redis特征
- redis通用指令
- redis五种数据结构类型
-
- String常见命令
- Hash类型
- list类型
- set类型
- SortedSet
- redis的JAVA客户端
- SpringDataRedis
-
- 快速入门
redis是什么
redis是C语言写的key-value存储系统是一个非常快速的开源非关系数据库,它存储五种不同类型的键映射,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。
这些数据类型都支持push/pop、add/remove并集和差集以及更丰富的操作,而且这些操作都是原子性是的。在此基础上,redis支持各种排序方式。
为保证效率,数据在内存中缓存。redis将更新的数据定期写入磁盘或将修改操作写入额外的记录文件,并在此基础上实现master-slave(主从)同步。
redis非关系数据库(NoSQl)
SQL和NoSQL的区别
1.sql结构化,nosql是非结构化的
sql
nosql
2.sql是相关的,而且nosql是无关联的
sql支持外键
而nosql是无关联的
3.sql支持查询,nosql非sql查询
sql
select id,name from student where id = "张三" ;
非sql
redis: get user : 1
4.sql支持事务,nosql一般不支持ACID实现最终一致性
NoSQL和SQL的对比
1.使用成本
NoSQL:NoSQL 使用简单,施工方便,大部分是开源软件,比较廉价,任何人都可以使用。
关系数据库:相对于NoSQL,关系数据库通常需要安装部署,开源较少,使用成本昂贵。尤其是 Oracle 数据库需要花费大量资金购买,使用成本相对较高。
2. 存储形式
NoSQL:NoSQL 存储形式丰富,如 key-value(键值对)形式、图结构形式、文档形式、列簇形式因此,它可以存储各种类型的数据。
关系数据库:关系数据库是由关系数据模型组织的,它是行列表结构,通过行与列的二元表示,数据之间有很强的相关性。它以二维表结构的形式持久存储数据。
3. 查询速度
NoSQL:NoSQL 在系统缓存中存储数据,不需要经过 SQL 层的解析,所以查询效率很高。
关系数据库:关系数据库将数据存储在系统硬盘中,查询时需要通过 SQL 层分析,然后读入内存,实现查询,查询效率低。
4. 扩展性
NoSQL:NoSQL 消除了传统关系数据库表与字段的关系,实现了真正的扩展。它以键值对的形式存储数据,它消除了数据之间的耦合,因此很容易扩展。
关系数据库:由于关系数据库采用关系数据模型存储数据,数据与数据相关性强,耦合性强,不易扩展。特别是有多表连接(join)查询机制的限制,使得扩展很难实现。
5. 是否支持 ACID 特性
ACID 特征是指数据库事务的执行要素,包括原子性、一致性、隔离性和持久性。
NoSQL:NoSQL 一般不支持 ACID 实现最终一致性。
关系数据库:支持关系数据库 ACID 特性,数据一致性严格。
6. 是否支持 SQL 语句
NoSQL:SQL 语句在 NoSQL 中间不支持,NoSQL 没有声明查询语言,也没有预定义模式。
关系数据库:支持关系数据库 SQL 还支持复杂查询。SQL 结构化查询语言、数据操作语言、数据定义语言。
NoSQL 数据与传统的关系数据库是互补的,对方的缺点是自身的优势,反之亦然。
redis特征
- 键值(key-value)型,value支持多种不同的数据结构,功能丰富
- 每个命令都有原子性
- 低延迟,快速(基于内存,1O多路复用,编码好)。
- 支持数据持久化
- 支持主从集群、分片集群
- 支持多语言客户端
redis通用指令
KEYS:检查符合模板的一切key,不建议在生产环境设备上使用
DEL:删除指定的key
EXISTS:判断key是否存在
EXPIRE:给一个key设定有效期,有效期到期key自动删除
TTL:查看一个KEY剩余有效期
当查看key有效期为-2点key已永久移除
当查看key有效期为-1点key永久有效
redis五种数据结构类型
String数据类型、List 数据类型、Hash数据类型(散列类型)set数据类型(无序集合)Sorted Set数据类型 (zset、有序集合)。
1.String类型
String是 redis 最基本的类型,最大的存储 512MB 的数据,String二进制是安全的,可以存储任何数据,如数字、图片、序列化对象等。String三种类型:字符串,int ,float。
String常见命令
SET:已经存在的添加或修改String类型键值对
GET:根据key获取String类型的value
MSET:批量添加多个String类型键值对
MGET:根据多个key获取多个String类型的value
INCR:让整形手术key自增1
INCRBY:让整形手术key例如:incrby num 2让num值自增2
INCRBYFLOAT:让浮点类型的数字自增并指定步长
SETNX:添加一个String前提是这种类型的键值是正确的key不存在,否则不执行
SETEX:添加一个String类型的键值对,并且指定有效期
Has类型
Hash数据类型(散列类型),hash用于存储对象。可以采用这样的命名方式:对象类别和ID构成键名,使用字段表示对象的属性,而字段值则存储属性值。。每一个Hash可以存储4294967295个键值对。
Hash类型命令
HSET key field value:添加或者修改hash类型key的field的值
HGET key field:获取一个hash类型key的field的值
HMSET:批量添加多个hash类型key的field的值
HMGET:批量获取多个hash类型key的field的值
HGETALL:获取一个hash类型的key中的所有的field和value
HKEYS:获取一个hash类型的key中的所有的field
HVALS:获取一个hash类型的key中的所有的value
HINCRBY:让一个hash类型key的字段值自增并指定步长
HSETNX:添加一个hash类型的key的field值,前提是这个field不存在,否则不执行
list类型
list是一个链表结构,主要功能是push、pop、获取一个范围的所有值等等。操作中key理解为链表的名字。
Redis中的List类型与Java中的LinkedList类似,可以看做是一个双向链表结构。既可以支持正向检索和也可以支持反向检索。
特征也与LinkedList类似:
有序
元素可以重复
插入和删除快
查询速度一般
常用来存储一个有序数据,例如:朋友圈点赞列表,评论列表等。
List的常见命令有:
LPUSH key element …:向列表左侧插入一个或多个元素
LPOP key:移除并返回列表左侧的第一个元素,没有则返回nil
RPUSH key element…:向列表右侧插入一个或多个元素
RPOP key:移除并返回列表右侧的第一个元素
LRANGE key star end:返回一段角标范围内的所有元素
BLPOP和BRPOP:与LPOP和RPOP类似,只不过在没有元素时等待指定时间,而不是直接返回nil
如何利用List结构模拟一个栈?
入口和出口在同一边
如何利用List结构模拟一个队列?
入口和出口在不同边
如何利用List结构模拟一个阻塞队列?
入口和出口在不同边
出队时采用BLPOP或BRPOP
set类型
set是集合,和我们数学中的集合概念相似,对集合的操作有添加删除元素,有对多个集合求交并差等操作。操作中key理解为集合的名字。
Redis的Set结构与Java中的HashSet类似,可以看做是一个value为null的HashMap。因为也是一个hash表,因此具备与HashSet类似的特征:
无序
元素不可重复
查找快
支持交集、并集、差集等功能
String的常见命令有:
SADD key member…: 向set中添加一个或多个元素
SREM key member …:移除set中的指定元素
SCARD key:返回set中元素的个数
SISMEMBER key member:判断一个元素是否存在于set中
SMEMBERS:获取set中的所有元素
SINTER key1 key2…:求key1与key2的交集
SDIFF key1 key2…:求key1与key2的差集
SUNION key1 key2 :求key1和key2的并集
SortedSet
Redis的SortedSet是一个可排序的set集合,与Java中的TreeSet有些类似,但底层数据结构却差别很大。SortedSet中的每一个元素都带有一个score属性,可以基于score属性对元素排序,底层的实现是一个跳表(SkipList)加hash表。
SortedSet具备下列特性:
可排序
元素不重复
查询速度快
因为SortedSet的可排序特性,经常被用来实现排行榜这样的功能。
SortedSet类型的常见命令
ZADD key score member:添加一个或多个元素到sorted set,如果已经存在则更新其score值
ZREM key member:删除sorted set中的一个指定元素
ZSCORE key member:获取sorted set中的指定元素的score值
ZRANK key member:获取sorted set 中的指定元素的排名
ZCARD key:获取sorted set中的元素个数
ZCOUNT key min max:统计score值在给定范围内的所有元素的个数
ZINCRBY key increment member:让sorted set中的指定元素自增,步长为指定的increment值
ZRANGE key min max:按照score排序后,获取指定排名范围内的元素
ZRANGEBYSCORE key min max:按照score排序后,获取指定score范围内的元素ZDIFF、ZINTER、ZUNION:求差集、交集、并集
注意:所有的排名默认都是升序,如果要降序则在命令的Z后面添加REV即可
redis的JAVA客户端
Redis的Java客户端很多,常用的有三种:Jedis、Redisson和lettuce。其中官方推荐使用Jedis和Redisson。 在企业中用的最多的就是Jedis。Jedis提供了完整Redis命令,而Redisson有更多分布式的容器实现。
以下就以Jedis为例看看如何使用
1.导入依赖坐标
<dependency>
<groupId>redis.clientsgroupId>
○<artifactId>jedisartifactId>
<version>3.7.0version>
dependency>
2.建立连接
private Jedisjedis;
@BeforeEach
voidsetUp() {
// 建立连接
jedis = new Jedis("192.168.220.130 ",6379);// 设置密码
jedis.auth("123456");
// 选择库
jedis.select(0);
}
3.测试String
@Test
voidtestString(){
//插入数据,方法名称就是redis命令名称,非常简单
Stringresult = jedis.set("name","三");
System.out.println("result=" + result);//获取数据
String name = jedis.get("name");
System.out.println("name= "+ name);
}
4.释放资源
@AfterEach
void tearDown() {
//释放资源
if(jedis != null) {
jedis.close();
}
}
因此,Jedis使用的基本步骤:
1.引入依赖
2.创建Jedis对象,建立连接
3.使用Jedis,方法名与Redis命令一致
4.释放资源
SpringDataRedis
SpringData是Spring中数据操作的模块,包含对各种数据库的集成,其中对Redis的集成模块就叫做SpringDataRedis,官网地址:(https://spring.io/projects/spring-data-redis)
它有以下几个作用:
提供了对不同Redis客户端的整合(Lettuce和Jedis)
提供了RedisTemplate统一API来操作Redis
支持Redis的发布订阅模型
支持Redis哨兵和Redis集群
支持基于Lettuce的响应式编程
支持基于JDK、JSON、字符串、Spring对象的数据序列化及反序列化
支持基于Redis的JDKCollection实现
快速入门
SpringDataRedis中提供了RedisTemplate工具类,其中封装了各种对Redis的操作。并且将不同数据类型的操作API封装到了不同的类型中:
以springboot模板为例
1.引入依赖
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-data-redisartifactId>
dependency>
<dependency>
<groupId>org.apache.commonsgroupId>
<artifactId>commons-pool2artifactId>
dependency>
2.yml配置文件
spring:
redis:
host:192.168.220.130
port:6379
password:123456
lettuce:
pool:
max-active:8 #最大连接
max-idle:8 #最大空闲连接
min-idle: 0 #最小空闲连接
max-wait:100 # 连接等待时间
3.注入RedisTemplate
@Autowired
private RedisTemplate redisTemplate;
4.编写测试
@SpringBootTest
public class RedisTest {
@Autowired
private RedisTemplateredisTemplate;
@Test
voidtestString(){
// 插入一条string类型数据
redisTemplate.opsForValue().set("name","李四");//读取一条string型数据
Object name = redisTemplate.opsForValue().get("name");
System.out.println("name = " +name) ;
}
}
SpringDataRedis的使用步骤:
1.引入spring-boot-starter-data-redis依赖
2.在application.yml配置Redis信息
3.注入RedisTemplate
本篇文章到这里就结束了,回头还会有更深入的redis介绍,包括redis的集群,主从,分布式锁,分布式缓冲,击穿穿透雪崩等高频率面试题的相关知识。
制作不易,感谢大佬支持
如果有什么不对的或需要改进的地方,还请大佬斧正。
再次谢谢各位小伙伴儿