Redis学习笔记

概念

基于内存存储的分布式NoSQL数据库,常用于高并发高吞吐场景需求的数据库或者作为关系型数据库比如MySQL的缓存数据库

数据结构

整体key-value键值对方式;

键都为String类型,value可以为String、Hash(key-value)、Set、List、zset、HyperLogLog等。

常用命令

按value类型不同分     

String:         字符串类型value

set 设置单个键值对

get 获取单个健的值

strlen 获取单个键值的长度

单机模式还有mset、mget等可以同时查询获取多个

Hash:       Map键值对类型 常用于对象存储

hset key1 field value 设置单个键的某个属性的值

hget key1 field 获取单个健的某个属性的值

hgetall 获取单个键所有属性的值

hvals 获取所有的值value

hdel 删除值

单机模式还有hmset、hmget等可以同时查询获取多个 java idea操作,注意需要传入Map类型的参数。

List:   队列   元素有序可重复 

lpush 从队列左侧添加值,

rpush 从右边添加

lrange key1 index[start] index[end]按index范围取值

lpop key1左弹出元素,弹出的元素从list删除

llen 获取长度

Set:        无序不重复,常用于去重

sadd 添加元素

smembers 获取成员

sismember 判断是否是成员

scard 获取成员个数

srem 删除成员

Zset:  有序set,需要添加一个double类型的score作为排序依据

zadd key1score1 value1

zrange 获取范围zset

zrevrange 获取倒序zset

zcard 获取元素个数

通用:keys 获取所有key

select 单机模式的选择数据库,select db0 到select db15

del 删除

exists 存在判断

expire(设置过期时间:秒)、

setex 设置键值同时设置过期时间,单位为秒

ttl(获取过期时间:秒 永久key过期时间为-1,临时key如果过期则为-2,没过期则为剩余时间秒数)

问题及解决方案

问题1:数据保存在内存中,会随着宕机而丢失

解决:

1.RDB机制

        将数据按照一定时间内的更新次数进行判断,满足条件将数据全量快照二进制文件写入磁盘默认开启

缺点:存在丢失风险:在两次数据之间断电丢失内存部分

优点:高效,恢复很快

2.AOF机制

        追加方式写入增删改的日志到磁盘,通过重演日志操作,可以恢复数据,默认不开启

写日志三种频次选择,always(每次更新都写)、everysec(每秒写一次)、no(不写)

缺点:恢复比较慢

优点:数据安全可以很大程度得到保障。如果数据需要绝对安全,选择always即可。

单机版的问题:

1.单点故障,数据不安全

解决:主从复制集群:实现读写分离,写操作主节点承担,读操作所有节点承担

缺点:产生新的单点故障master节点

解决master节点单点故障:哨兵集群:对主从各节点及其他哨兵节点进行监测,故障时进行切换

2:单机内存上限

每个节点保存相同数据,根据木桶效应,整个集群的存储能力会由单机内存最低的机器决定

解决:

分片集群:将多个redis小集群整体看做一个大集群,整体分配槽位,将数据进行按槽位分配,根据Key进行槽位运算:CRC16【K】 & 16384(循环冗余码)

优点:解决了单点故障问题
缺点:

1.很难支持批量命令操作

2.还存在热点问题。如果大量key相同,会造成数据都访问一个槽位,一台机器。

问题背景

传统数据库比如MySQL Oracle连接资源有限,对于并发访问的限制比较大,如果直接处理所有来自外部的请求,很容易宕机

redis数据库用作缓冲数据库,接受外来查询请求,如果有key,则直接返回查询结果,如果没有再去数据库查

缓存穿透问题

如果有恶意攻击短时间高并发查询不存在的key,就会直接穿过redis访问到后台数据库,压力会给到后端的数据库

解决

1.对于短时间高频高并发访问的ip,限制其访问

2.对于高频查询不存在的key,在redis中给其一个默认value,等查询时返回默认值(比如返回查询结果不存在,请稍后重试)。

3.在redis中构建布隆过滤器,将数据数数据映射到其中,外部的查询先在布隆过滤器进行判断,如果不存在则直接返回

缓存击穿问题

某个key被高频访问,如果设置了过期时间到来,突然从redis删除,则请求会直接穿过redis访问到后台数据库

解决

内存充足情况下,高频访问的数据设置为永不过期

设置同一个时间,相同key只允许有一个访问数据库,其他的都阻塞掉,等查询的结果返回保存到redis再从缓存读取

缓存雪崩问题

如果redis大部分key短时间内全部过期或者redis服务重启,造成同一时间大量访问从redis中查不到数据,直接访问到后台数据库。

解决

1.如果内存充足,对于大部分的key,设置为永不过期。

2.合理设置过期时间,比如设置30分钟随机加上-10到10的范围值。进行一定程度的随机分布过期时间

事务机制

Redis事务和RDBMS事务不太一样,它只是将一组命令放入队列,一个一个执行,没有原子性,一致性也不够完整。如果是编译性的错误,会导致所有的都不执行,但如果是执行时的错误,则除了失败的,其他命令都会执行;

尚硅谷是一个教育机构,他们提供了一份关于Redis学习笔记。根据提供的引用内容,我们可以了解到他们提到了一些关于Redis配置和使用的内容。 首先,在引用中提到了通过执行命令"vi /redis-6.2.6/redis.conf"来编辑Redis配置文件。这个命令可以让你进入只读模式来查询"daemonize"配置项的位置。 在引用中提到了Redis会根据键值计算出应该送往的插槽,并且如果不是该客户端对应服务器的插槽,Redis会报错并告知应该前往的Redis实例的地址和端口。 在引用中提到了通过修改Redis的配置文件来指定Redis的日志文件位置。可以使用命令"sudo vim /etc/redis.conf"来编辑Redis的配置文件,并且在文件中指定日志文件的位置。 通过这些引用内容,我们可以得出结论,尚硅谷的Redis学习笔记涵盖了关于Redis的配置和使用的内容,并提供了一些相关的命令和操作示例。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Redis学习笔记--尚硅谷](https://blog.csdn.net/HHCS231/article/details/123637379)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Redis学习笔记——尚硅谷](https://blog.csdn.net/qq_48092631/article/details/129662119)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梦㐅触及轮回

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值