redis以及相关操作
迪丽瓦拉
2024-03-28 19:25:32
0

redis是什么?

s(Remote Dictionary Server ),即远程字典服务,是一个开源的,使用 C 语言编写的,支持网络交互的,内存中的 Key-Value 数据结构存储系统,支持多种语言,它可以用作数据库、缓存和消息中间件,是一款非关系型数据库。

它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets)。

特点:数据存储在内存中(支持数据持久化的),结构简单(键值对的),高性能(因为结构简单,数据类型简单)

作用(用途):对数据进行缓存操作,为关系型数据库起到一个保护作用(主要是查询操作)

为什么我们需要学习redis?

redis和mysql的对比

关系型数据库如mysql,数据在硬盘上存储,作为根基,但是访问操作量过大的情况下,需要频繁的IO操作,很可能导致数据库崩溃

redis数据库一些相关操作(了解)

 1.在linux下如何安装redis数据库

上传源码包到/opt

解压压缩包 tar -zxvf redis-6.0.8.tar.gz

并进入到解压后的文件夹中 cd redis-6.0.8

预编译: make

创建一个目录(安装的位置redis)

安装到指定的新建目录:make install  PREFIX=/opt/redis

进行bin目录下/opt/redis/opt,执行命令: ./redis-serve启动redis服务

redis服务器启动后,不能后台运行,在windows中不能远程链接访问,redis安装好了之后,需要做几个设置:

​    开启后台运行,切换到命令行是,redis服务依然可以执行

​    开启远程连接

​    设置redis连接密码

​     需要从源码中赋值redis.config 文件到安装路径的/opt/redis/bin

​     修改文件

​     修改后启动方式有所不同,启动后就处于后台运行

​      (ps -ef | grep redis  查看服务进程)

​     关闭redis服务:1.kill -9  pid(即进程id) 强制关闭redis服   务进程,简单粗暴,不建议使用

​                                 2.在客户端模式中使用shut down服务

然后我们进入客户端模式: 可以进行数据的操作

./redis-cli 

输入密码:auth 密码 

测试:  ping 

ctrl+c 退出客户端模式

2.客户端模式中redis数据类型,以及基本操作?

redis中有5种基本类型,这五种基本类型指的是值(value)的类型。键(key)永远都是都是string类型的。

分别是 字符串  哈希表  list  set  zset(有序的)

还有6种底层类型(需要了解)

(1)全局哈希表

整个redis内存就是一个哈希表,将所有键值对存储在这个全局哈希表中,通过key计算出哈希值,确定位置,然后将整个键值对存储进去,由于是哈希结构,所以redis读写速度非常快,这也是其性能高的原因之一。

凡是使用hash结构,都有可能出现hash冲突,这是不可避免的,可以通过链式哈希解决冲突,也就是同一个桶里面的元素使用链表保存。但是当链表过长就会导致查找性能变差可能。所以 redis 为了追求块,使用了两个全局哈希表。用于 rehash 操作,增加现有的哈希桶数量,减少哈希冲突。 

开始默认使用【hash 表 1】保存键值对数据,【hash 表 2】此刻没有分配空间。 

当数据越来越多的触发 rehash 操作,则执行以下操作: 

给【hash 表 2】分配更大的空间 

将【hash 表 1】的数据重新映射拷贝到【hash 表 2】中 

释放【hash 表 1】的空间 

值得注意的是,将 hash 表 1 的数据重新映射到 hash 表 2 的过程并不是一次性的,这样会造成 redis 阻塞,无法提供服务。 

而是采用了渐进式 rehash,这样每次处理客户端请求的时候,先从【hash 表 1】第一个索引开始,将这个位置的所有数据拷贝到【hash 表 2】中,就这样将rehash 分散到多次请求过程中,避免耗时阻塞.

(2)String类型(字符串)

应用场景

先进入客户端模式opt/reids/bin 目录下输入命令

value可以是**string字符串,数字,对象**

1.单值缓存:set key  value(字符串)

2.json对象缓存:set key  value(json格式数据,也是字符串)

json字符串是一个整体,不能对其中的某个属性进行操作。

3.计数器:set 键 0 : 设置文章访问量 

incr 键 : 文章访问量+1 

decr 键 : 文章访问量-1 

get 键 : 获得值

4.共享session:在多个后端几区那种进行数据共享,或者进行多项数据共享,消息中间件。

(3)哈希类型

 适合存储对对象数据改变的场景

redis hash是一个string类型的field和value的映射表,可以具体对值中的某个属性的值进行改变。

user(键) :  name:jim 

​                          age:12

​                          name1:tom

​                         age1:14(可以有多个值)

linux下命令:

hmset key  属性1 值1 属性n 值n  设置

hmget ket  属性1  属性2  获得key下的某些属性

hdel key  属性1 属性2 删除key下的某些属性

hlen key  获得当前key下面有多少个属【性值对

hcrby key  属性     增加的值(如果要减,就加负数即可)

应用的场景(常见):app的购物车,键就是你的id  ,里面的值就是每件商品的信息,商品数量加减就可以使用上面的命令。

(4)list列表

键还是不变,是string类型,而值(value)则是list类型,是一个列表,可以在列表前插入元素,也可在列表尾插入元素。

lpush key  element 从头部插入

rpush  key element 从尾部插入

lpop key 删除并返回头部元素

rpop key 删除并返回尾部元素

lrange key start stop 查看列表元素

应用场景:实现栈和队列

(5)set

存储的元素们是无序的,就是不按照添加的顺序,也不重复。

sadd key 元素1,元素2,... 添加元素

srem key  元素  删除元素

smembers key  查看指定key中所有元素

scard key 查看元素数量

(6)zset

(sorted set:有序集合)

存储的元素们是可以排序(可以自己指定排序的规则)的set集合,也是不允许重复的。

zset 可以排序的set集合

zadd key 分数 元素

zrange key start stop

zcard key 查看元素的个数

zincrby key 增量 元素 未指定的元素添加指定的分数

zcore key 元素 查看元素的分数

应用场景:不重复,有序的信息显示, 排行榜、点赞顺序等等

以上各种的操作,在redis中兼键值存储都是长久保存的,key是不会失效的。

设置失效时间

redis可以在设置键值对是,可以为key设置一个失效事件,到期自动销毁。

set key 值 ex(秒)/dx(毫秒)  值就是这个键值对存在的时间

ttl  key 查看剩余的时间秒

pttl 查看剩余的时间毫秒

springBoot集成redis

方式1:redis官方提供了有一个连接类,jedis,即就是不使用spring框架我们也可以使用redis数据库,类似于jdbc

方式2:springBoot官方对jedis进行了封装,提供了一个RedisTemplete类,配置好后使用时@Autowired直接注入就可以使用。需要在键值对存储时,进行反序列化操作(我们添加redisconfig类将这个功能进行包装)。

我们现在使用redis首选方式2:

优点:

1.spring进行了封装,提供了一个RedisTemplate类,有数据库连接池功能 

2.针对不同的数据类型,进行了一个api的分类

operation 接口. 

ValueOperations:简单 K-V 操作   

SetOperations:set 类型数据操作 

ZSetOperations:zset 类型数据操作 

HashOperations:针对 map 类型的数据操作 

ListOperations:针对 list 类型的数据操作

3.提供事务管理

4.提供序列化,反序列化功能

对redis进行总结:

现实开发中,什么样的数据应该放在缓存redis中,放多久都需要根据实际情况来定。一般就是很少改变,更新频率小的数据,或者是访问量很大的数据,我们需要用redis辅助mysql进行抗压。

相关内容