Redis学习笔记

这是一篇全面介绍Redis的文章,涵盖了从安装到高级特性的详细步骤。内容包括安装Redis、数据类型详解、事务与持久化机制、主从复制、集群搭建、问题解决以及在Maven和SpringBoot项目中的整合。同时,还介绍了Redis 6.0的新特性如ACL和IO多线程。
摘要由CSDN通过智能技术生成

一、安装Redis

1.1 下载压缩包

先在VM虚拟机里安装Centos7,并且SecureCRT连接上Centos

1.从百度网盘下载redis-6.2.1.tar.gz到桌面
2.通过SecureFX工具,把压缩包上传到Linux系统的/opt目录下
3.通过SecureCRT工具,先cd /opt 再ls,查看压缩包

1.2 安装gcc

1.gcc --version  未找到命令,证明gcc没装
2.yum install gcc 输入两次y
3.gcc --version  看到版本4.8.5即成功

1.3 安装Redis

1.tar -zxvf redis-6.2.1.tar.gz
2.cd redis-6.2.1
3.make
4.make install
5.cd /usr/local/bin 再ls 看到好几个redis开头的文件,此时已安装完成

1.4 修改配置文件

1.cp /opt/redis-6.2.1/redis.conf  /etc/redis.conf
2.vim /etc/redis.conf   
3.输入/GENERAL  在GENERAL下面三行注释
4.Esc键 + 输入“a” 
5.把daemonize no改成yes  
6.Esc键 + 输入 :wq 保存退出
7.vim /etc/redis.conf   
8.Esc键 + 输入“:set nu”设置行号
9.Esc键 + 输入“a” 
10.把75行的 bind 127.0.0.1 最前面加上井号,整句注释掉
11.把94行的 protected-mode 改成no
12.Esc键 + 输入 :wq 保存退出

1.5 开启Redis服务

1.cd /usr/local/bin 
2.systemctl status firewalld 查看防火墙状态,如果是active(running) 表示防火墙开启
3.systemctl stop firewalld 暂时关闭防火墙,Linux重启再失效
4.redis-server /etc/redis.conf 启动Redis服务
5.redis-cli 看到127.0.0.1:6379 表示客户端连接上了
6.再输入ping,看到PONG,表示连接正常

1.6 关闭Redis服务

1.先exit,再redis-cli shutdown    关闭Redis服务
2.shutdown -h now    Linux关机

二、数据类型

2.1 基本操作

1.往Redis里存数据
select 0
set k1 lucy  
set k2 mary  
set k3 jack

2.查看当前数据库所有的key
keys * 

3.判断k1是否存在,1存在,0不存在
exists k1

4.查看k2的类型
type k2

5.删除k3
del k3   

6.为k1设置过期时间10秒钟
expire k1 10

7.查看还有多少秒过期,-1表示永不过期,-2表示已过期
ttl k1

8.切换数据库,默认就是使用0号数据库,总共16个数据库,所有数据库密码一样
select 0

9.查看当前数据库的key的数量
dbsize

10.清空当前数据库
flushdb

11.清空全部数据库
flushall

2.2 String

1.往Redis里存数据
select 0
set k1 lucy  
set k2 mary  
set k3 jack

2.查询k1对应的值
get k1

3.覆盖k1的值,此时k1=lucycy
set k1 lucycy
setnx k1 tom  只有在key不存在时,才能设置key的值,此时k1已存在,所以设置失败,返回0

4.追加到k1末尾,此时k1=lucycyabc
append k1 abc

5.获得k1长度,此时为9
strlen k1

6.将k4中储存的string类型数字值,执行加减操作,加减完成后还是string类型
set k4 500
incrby k4 10    此时k4=510
decrby k4 20	此时k4=490

7.批量操作
mset k5 aa k6 bb k7 cc   
mget k5 k6 k7
msetnx k5 aav k6 bbv k7 ccv  只要有一个key不存在时,这条命令就不会执行成功

8.获得值的范围,类似java中的substring,截取字符串
set name lucymary
getrange name 0 3  代表截取前四个字符,得到lucy

9.追加字符串值
setrange name 3 abc 代表第三个字符后的位置插入abc
get name   得到lucabcymary

10. 设置键值的同时,设置过期时间,单位秒写在中间
setex age 20 value30

2.3 List

1.从左边插入值   [v3,v2,v1]
lpush k1 v1 v2 v3

2.从右边插入值   [v1,v2,v3]
rpush k2 v1 v2 v3

3.取出最左边的值,随后该值不存在
lpop k1

4.取出最右边的值,随后该值不存在
rpop k2

5.从k1右边取出值,放入k2左边   [v1,v11,v12,v13]
lpush k1 v1 v2 v3
rpush k2 v11 v12 v13
rpoplpush  k1 k2

6.查看所有值
lrange k1 0 -1

7.按照索引下标查看值
lindex k1 0

8.获得列表长度
llen k1

9.在原先值的后面或前面插入新值
linsert k2 before "v11" "newv11"
linsert k2 after "v12" "newv12"

10.删除1个值,删除的值为newv11
lrem k2 1 "newv11" 

11.将列表下标为1的值替换成tys
lset k2 1 tys

2.4 Set

1.添加值
sadd k1 v1 v2 v3

2.查看k1所有值
smembers k1

3.判断k1中是否含有v1,1存在,0不存在
sismember k1 v1

4.查看k1的元素个数
scard k1

5.删除k1中的v1和v2
srem k1 v1 v2

6.随机从k2中取出一个值,随后该值不存在
sadd k2 v1 v2 v3 v4
spop k2

7.随机从k2中取出一个值,该值不删除
srandmember k2

8.把k1中的v3移动到k2
sadd k1 v1 v2 v3 v7
sadd k2 v4 v5 v6 v7
smove k1 k2 v3

9.交集并集差集
sinter k1 k2 返回两个集合的交集元素。
sunion k1 k2 返回两个集合的并集元素。
sdiff k1 k2  返回两个集合的差集元素。(k1中有的,但k2中没有的)

2.5 Hash

1.添加值
hset user:1001 id 1
hset user:1001 name zhangsan
hset user:1001 age 20

2.查看值
hget user:1001 id 
hget user:1001 name 
hget user:1001 age

3.一次添加完
hmset user:1002 id 2 name lisi age 30

4.查看user:1002中的name是否存在
hexists user:1002 name

5.查看user:1002中的所有field,即id name age
hkeys user:1002

6.查看user:1002中的所有value,即2 lisi 30 
hvals user:1002

7.给user:1002中的age值加上2
hincrby user:1002 age 2

8.给user:1002加性别
hsetnx user:1002 gender 1

2.6 Zset

1.将元素加入到有序集合Zset中
zadd topic 200 java 300 c++ 400 mysql 500 php

2.查看所有值
zrange topic 0 -1

3.查看300到500的值,从小到大(带评分)
zrangebyscore topic 300 500 [withscores]

4.查看500到200的值,从大到小(带评分)
zrevrangebyscore topic 500 200 [withscores]

5.为java的评分加上50
zincrby topic 50 java

6.删除php
zrem topic php

7.统计评分在200到300范围内的元素个数 
zcount topic 200 300

8.查看java的排名,默认从小到大,0代表排第一个
zrank topic java

2.7 Bitmaps

1.设置偏移量的值,假设场景
//用户是否访问过网站,存放在Bitmaps中,将访问的用户记做1,没有访问的用户记做0,用偏移量作为用户的id
//假设现在有20个用户,userid=1, 6, 11, 15, 19的用户对网站进行了访问
setbit users:20220516 1 1
setbit users:20220516 6 1
setbit users:20220516 11 1
setbit users:20220516 15 1
setbit users:20220516 19 1

2.获取偏移量的值,返回0说明没有访问过
getbit users:20220516 6
getbit users:20220516 20

3.统计字符串被设置为1的数量,这儿返回5个,相当于计算2022-05-16这天的访问用户数量
bitcount users:20220516 

4.计算两天都访问过网站的用户数量,取交集,计算两天总活跃数量,取并集
setbit users:20201104 1 1
setbit users:20201104 2 1
setbit users:20201104 5 1
setbit users:20201104 9 1
setbit users:20201103 0 1
setbit users:20201103 1 1
setbit users:20201103 4 1
setbit users:20201103 9 1

bitop and users:20201104_03 users:20201103 users:20201104   返回2个

bitop or users:20201104_03 users:20201103 users:20201104
bitcount users:20201104_03             返回6个

2.8 HyperLogLog

1.添加值,自动去重,未成功添加返回0
pfadd program "java"
pfadd program "php"
pfadd program "java"

2.计算基数,就是计算不重复的数,2个
pfcount program

3.将k1和program合并后的结果存储在k100中,返回4个
pfadd k1 "a"
pfadd k1 "b"
pfmerge k100 k1 program
pfcount k100 

2.9 Geospatial

1.添加经纬度,可同时加多个
geoadd china:city 121.47 31.23 shanghai
geoadd china:city 106.50 29.53 chongqing 114.05 22.52 shenzhen 116.38 39.90 beijing

2.获取经纬度
geopos china:city shanghai

3.获取两个位置的直线距离,单位指定千米
geodist china:city beijing shanghai km

4.以给定的经纬度为中心,找出半径为1000千米内的元素
georadius china:city 110.00 30.00 1000 km

三、事务操作与持久化

3.1 事务

Redis事务

//输入multi命令开始,输入的命令都会依次进入命令队列中,但不会执行
//输入exec后,Redis会将之前的命令队列中的命令依次执行
//输入discard放弃组队,直接取消队列了

1.multi
2.set key1 value1
3.set key2 value2
4.exec/discard

//组队中某个命令出现了错误,执行时整个队列都会被取消
//执行阶段某个命令报出了错误,则只有报错的命令不会被执行,而其他的命令都会执行

3.2 锁机制

Redis锁机制

悲观锁,顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁。
传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁,读锁,写锁等,都是在做操作之前先上锁

乐观锁,顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁
但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制
乐观锁适用于多读的应用类型,例如秒杀抢票场景。Redis就是利用这种check-and-set机制实现事务的

先执行watch [key],再执行multi,watch可以监视多个key
如果在事务执行之前,这些key被其他命令所改动,那么事务将被打断

unwatch,取消watch命令对所有key的监视
如果在执行watch命令之后,exec命令或discard命令先被执行了的话,那么就不需要再执行unwatch了

3.3 事务特性

Redis事务三特性

1.单独的隔离操作 
事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断 

2.没有隔离级别的概念 
队列中的命令没有提交之前都不会实际被执行,因为事务提交前任何指令都不会被实际执行

3.不保证原子性 
事务中如果有一条命令执行失败,其后的命令仍然会被执行,没有回滚 

3.4 Redis连接池

import redis.clients.jedis.*;

public class JedisPoolUtil {
   
	private static volatile JedisPool jedisPool = null;

	private JedisPoolUtil() {
   
	}

	public static JedisPool getJedisPoolInstance() {
   
		if (null == jedisPool) {
   
			synchronized (JedisPoolUtil.class) {
   
				if (null == jedisPool) {
   
					JedisPoolConfig poolConfig = new JedisPoolConfig();
					poolConfig.setMaxTotal(200);
					poolConfig.setMaxIdle(32);
					poolConfig.setMaxWaitMillis(100*1000);
					poolConfig.setBlockWhenExhausted(true);
					poolConfig.setTestOnBorrow(true);  // ping  PONG
				 
					jedisPool = new JedisPool(poolConfig, "192.168.227.128", 6379, 60000 );
				}
			}
		}
		return jedisPool;
	}

	public static void release(JedisPool jedisPool, Jedis jedis) {
   
		if (null != jedis) {
   
			jedisPool.returnResource(jedis);
		}
	}
}
=========================================================================================
//通过连接池得到jedis对象
JedisPool jedisPoolInstance = JedisPoolUtil.getJedisPoolInstance();
Jedis jedis = jedisPoolInstance.getResource();    

3.5 持久化-RDB

RDB技术,在指定的时间间隔内将内存中的当前时间点里的Redis数据写入磁盘

RDB技术的持久化过程是,Redis会单独创建一个子进程(Fork)来进行持久化,就是写时复制技术,会先将数据写入到一个临时文件中,默认为dump.rdb,待持久化完成后,再用这个临时文件替换之前的文件 

可以通过lastsave命令获取最后一次成功执行备份的时间,百度搜unix时间戳转换工具

优势
1.适合大规模的数据恢复
2.对数据完整性和一致性要求不高更适合使用
3.节省磁盘空间
4.恢复速度快

劣势
1.Fork的时候,内存中的数据被克隆了一份,大致2倍的空间损失需要考虑
2.虽然Redis在fork时使用了写时复制技术,但是数据庞大时还是比较消耗性能
3.备份周期在一定间隔时间做一次备份,所以如果Redis意外down掉的话,就会最后一次持久化后的数据可能丢失

3.6 持久化-AOF

以日志的形式来记录每个写操作(增量保存),将Redis执行过的所有写指令记录下来,只许追加文件但不可以改写文件
Redis重启的话就根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作

AOF默认不开启
1.vim /etc/redis.conf
2.找到appendonly no改成yes  即开启AOF
3.Esc键 + 输入 :wq 保存退出
4.重启Redis
5.cd /usr/local/bin  再ll  查看是否有appendonly.aof文件

如果AOF和RDB同时开启,Redis系统默认取AOF的数据

AOF同步频率设置
appendfsync always      始终同步,每次Redis的写入都会立刻记入日志,性能较差但数据完整性比较好
appendfsync everysec    每秒同步,每秒记入日志一次
appendfsync no  		不主动进行同步,把同步时机交给操作系统

AOF持久化流程
1.客户端的请求写命令会被追加到AOF缓冲区内
2.AOF缓冲区根据AOF持久化策略[always,everysec,no]将操作sync同步到磁盘的AOF文件中
3.AOF文件大小超过重写策略或手动重写时,会对AOF文件rewrite重写,压缩AOF文件容量
4.Redis服务重启时,会重新加载AOF文件中的写操作达到数据恢复的目的

优势
1.备份机制更稳健,丢失数据概率更低
2.可读的日志文本,通过操作AOF更稳健,可以处理误操作

劣势
1.比起RDB占用更多的磁盘空间
2.恢复备份速度要慢
3.每次读写都同步的话,有一定的性能压力
4.存在个别Bug

四、主从复制

4.1 一主多从

主机数据更新后,根据配置和策略,自动同步到从机机制,主机master以写为主,从机slave以读为主,一主多从

打印主从复制的相关信息,看第二行本服务器是master还是slave,第三行有几个从机
info replication

在从机服务器上执行 代表连接主机 但此命令执行完服务器重启就会失效,永久实现是修改配置文件
slaveof 192.168.227.128 6379

在从机上写数据会报错,比如在从机上执行set k4 v4会失败

4.2 主从复制原理

主从复制原理
1.从机启动成功连接到主机后会发送一个sync命令
2.主机接到命令启动后台的存盘进程,同时收集所有接收到的用于修改数据集命令,在后台进程执行完毕之后,主机将传送整个数据文件到从机,以完成一次完全同步
3.只要是重新连接主机,一次完全同步(全量复制)将被自动执行

4.3 薪火相传与反客为主

薪火相传 
上一个从机可以连接下一个从机,主机只发给第一个从机,该从机充当小组长,再同步信息给他的组员从机
该方法可以有效减轻主机的写压力,去中心化降低风险
风险是一旦某个从机宕机,后面的从机都没法备份数据

反客为主
当一个主机宕机后,从机可以立刻升为主机,其后面的从机不用做任何修改。
在从机执行 slaveof no one 命令将从机变为主机

4.4 哨兵模式

哨兵模式
是反客为主的自动版,能够后台监控主机是否故障,如果故障了根据投票数自动将从机转换为主机

选择从机规则
1.优先级在redis.conf中默认100:replica-priority 10,设置为10,值越小优先级越高
2.偏移量是指获得原主机数据最全的,偏移量越大越会被选中
3.每个redis实例启动后都会随机生成一个40位的runid,runid越小越会被选中

在myredis文件夹下,新建sentinel.conf文件
sentinel monitor mymaster 127.0.0.1 6379 1
其中mymaster为监控对象起的服务器名称,1为至少有多少个哨兵同意迁移
执行redis-sentinel  /myredis/sentinel.conf 
此时哨兵就启动起来了

4.5 复制延时

复制延时
由于所有的写操作都是先在主机上操作,然后同步更新到从机上,所以从主机同步到从机机器有一定的延迟,当系统很繁忙的时候,延迟问题会更加严重,从机机器数量的增加也会使这个问题更加严重。

五、集群

5.1 集群概念

什么是集群?
Redis集群实现了对Redis的水平扩容,即启动N个redis节点,将整个数据库分布存储在这N个节点中,每个节点存储总数据的1/N。

Redis集群通过分区来提供一定程度的可用性:即使集群中有一部分节点失效或者无法进行通讯,集群也可以继续处理命令请求。

5.2 搭建集群

集群登录方式,因为是去中心化,所以访问任何一个ip地址都可以
redis-cli -c -p 6379

查看集群的节点信息
cluster nodes

redis如何分配这六个节点?
1.一个集群至少要有三个主节点。
2.选项 --cluster-replicas 1 表示我们希望为集群中的每个主节点创建一个从节点。
3.分配原则尽量保证每个主数据库运行在不同的IP地址,每个从库和主库不在一个IP地址上

5.3 插入值

1.根据返回的ip地址看他存到哪个主机上
set k1 v1  

2.输入多个数据需要加大括号,告诉集群他们同属user组,这样才能存储成功
mset name{user} lucy age{user} 20 address{user} china

3.计算k1放入哪个插槽,返回4847
cluster keyslot k1 

4.当前服务器的4847插槽中,存放有几个键
cluster countkeysinslot 4847

5.查询当前服务器的4847插槽中的10个键的内容
cluster getkeysinslot 4847 10

插槽概念
1.一个 Redis集群包含16384个插槽,数据库中的每个键都属于这16384个插槽的其中一个
2.集群使用公式CRC16(key)%16384,来计算键key属于哪个槽
3.集群中的每个节点负责处理一部分插槽。举个例子,如果一个集群可以有主节点,其中:
节点A负责处理 0 号至 5460 号插槽。
节点B负责处理 5461 号至 10922 号插槽。
节点C负责处理 10923 号至 16383 号插槽。

5.4 故障恢复

如果主节点挂掉,从节点自动升为主节点,并且主节点恢复后会自动变成从机

如果某一段插槽的主从都挂掉,而cluster-require-full-coverage为yes,那么整个集群都挂掉

如果某一段插槽的主从都挂掉,而cluster-require-full-coverage为no,那么该插槽数据全都不能使用

redis.conf中的参数  cluster-require-full-coverage

5.5 Jedis开发

即使连接的不是主机,集群会自动切换主机存储。主机写,从机读。
无中心化主从集群。无论从哪台主机写的数据,其他主机上都能读到数据。

//对着src/main/java==右键新建==软件包==com.tys.jedis
//对着com.tys.jedis==右键新建==Java类==RedisClusterDemo

package com.tys.jedis;

import org.junit.*;
import redis.clients.jedis.*;
import java.util.*;

public class RedisClusterDemo {
    public static void main(String[] args) {
    	HostAndPort hostAndPort = new HostAndPort("192.168.227.128",6379);
    	JedisCluster jedisCluster = new JedisCluster(hostAndPort);
        jedisCluster.set("
尚硅谷是一个教育机构,他们提供了一份关于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 ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值