redis超详细介绍!

关系型数据库和非关系型数据库?

sql

关系型数据库,操作的标准语言,mysql,sqlserver,oracle...

NoSQL

not only sql,不仅仅是sql,是非关系型数据库的统称。

关系型数据库(例如mysql)

以表为单位进行数据存储,表与表之间有关联关系,数据存储在硬盘上。(关系型数据库在互联网,大数据背景下,出现一些问题,时不时的去访问硬盘上的数据,这样会产生大量的IO,有可能使得数据库崩溃)

优点

容易理解

使用方便,通用的 sql 语言

易于维护,丰富的完整性(实体完整性、参照完整性和用户定义的完整性)

大大降低了数据冗余和数据不一致的概率缺点

缺点

磁盘 I/O 是并发的瓶颈

海量数据查询效率低

横向扩展困难,无法简单的通过添加硬件和服务节点来扩展性能和负载能力,

当需要对数据库进行升级和扩展时,需要停机维护和数据迁移

多表的关联查询以及复杂的数据分析类型的复杂 sql 查询,性能欠佳。因为要

保证 ACID.

非关系型数据库(如redis)

没有表,没有关联关系,数据以键值对形式存在。

优点

结构简单易扩展

高性能灵活的数据模型

缺点

只适合存储一些较为简单的数据

不适合复杂查询的数据

不适合持久存储海量数据

redis

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

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

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

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

为什么学习?redis和mysql的对比

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

在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 退出客户端模式

redis数据类型

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

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

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

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

全局哈希表

整个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 分散到多次请求过程中,避免耗时阻塞.

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:在多个后端几区那种进行数据共享,或者进行多项数据共享,消息中间件。

哈希类型

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

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 ,里面的值就是每件商品的信息,商品数量加减就可以使用上面的命令。

list列表

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

lpush key element 从头部插入

rpush key element 从尾部插入

lpop key 删除并返回头部元素

rpop key 删除并返回尾部元素

lrange key start stop 查看列表元素

应用场景:实现栈和队列

set

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

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

srem key 元素 删除元素

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

scard key 查看元素数量

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辅助mysql进行抗压。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值