Redis基本功能详解

本文详细介绍了Redis的安装步骤,包括下载、解压、编译及启动,并讲解了Redis的基本配置项。此外,文章深入探讨了Redis的常用数据类型如String、Hash、List、Set和Zset的API使用方法,以及键的管理操作,如过期时间设置、键的迁移等。最后,提到了Redis的持久化、主从复制和高可用性等高级特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

分布式缓存-Redis基本功能详解

1.前言

做了几年开发的对缓存的概念都应该不陌生,常见的缓存组件有Redis、mongodb、memcached。这篇文章就简单介绍一下redis的常见使用场景以及基本api的使用。
redis是一个基于键值对key-value的数据库,其中value可以是String、hash、list、set、zset等多种数据结构,能够满足很多应用场景,还提供了键过期,发布订阅,事务,流水线等附加功能。
特性:
1〉速度快,数据放在内存中,官方给出的读写性能10万/S,与机器性能也有关
a,数据放内存中是速度快的主要原因
b,C语言实现,与操作系统距离近
c,使用了单线程架构,预防多线程可能产生的竞争问题
2〉键值对的数据结构服务器
3〉丰富的功能:见上功能
4〉简单稳定:单线程
5〉持久化:发生断电或机器故障,数据可能会丢失,持久化到硬盘
6〉主从复制:实现多个相同数据的redis副本
8〉高可用和分布式:哨兵机制实现高可用,保证redis节点故障发现和自动转移
9〉客户端语言多:java php python c c++ nodejs

2.安装以及api的使用

2.1安装

1.Redis下载,我这里使用的是redis-6.2.5这个版本,推荐使用linux。毕竟大多数时候咱们服务器也是用的linux。
在这里插入图片描述

2.解压,我的是放到opt目录下,根据你自己喜好,解压命令
tar -zvxf redis-6.2.5.tar.gz
3.解压之后编译进入redis目录
make PREFIX=/opt/redis-6.2.5 install 如果报错的话执行下面的
make MALLOC=libc
关于redis内存分配器选择的描述:在构建Redis时,通过设置“MALLOC”环境变量来选择非默认的内存分配器。Redis默认情况下编译并链接到libc malloc的,但在Linux系统上默认的内存分配器是jemalloc。linux系统之所以选择jemalloc作为默认的内存分配器,是因为jemalloc被证明比libc malloc具有更少的碎片问题。

要强制编译redis使用libc malloc,使用: make MALLOC=libc 指令
再执行 make PREFIX=/opt/redis-6.2.5 install
4.这个时候你就能在redis目录下看到多了一个bin目录
在这里插入图片描述
5.启动命令
./redis-server /opt/redis-6.2.5/redis.conf
指定 /opt/redis-6.2.5/redis.conf 这个配置文件在这里插入图片描述
到这里redis的安装基本就完成了。

2.1使用

使用./redis-server /opt/redis-6.2.5/redis.conf 启动你会发现只要一退出redis就停了。所以在命令上得加上&符号 ./redis-server& /opt/redis-6.2.5/redis.conf &符号带表后台启动

2.1配置文件

编译之后,在redis目录下会多出来一个redis.conf文件 这个就是配置文件了 。下面说一下常规的一些配置项

配置项解释
daemonizeyes/noyes表示启用守护进程,默认是no即不以守护进程方式运行。其中Windows系统下不支持启用守护进程方式运行
port6379程序运行端口
protected-modeyes/no保护模式,该模式控制外部网是否可以连接redis服务,默认是yes,所以默认我们外网是无法访问的,如需外网连接rendis服务则需要将此属性改为no
timeout1000当客户端闲置多长时间后关闭连接,如果指定为 0,表示关闭该功能
databases16设置数据库的数量,默认的数据库是16按下标0-15排列,集群环境只有一个0
dir/opt/redis-data本地数据库存放目录
bind127.0.0.1绑定的主机地址
requirepass123456设置 Redis 连接密码,如果配置了连接密码,客户端在连接 Redis 时需要通过密码验证,默认关闭

还有其他的一些配置项这里就不再一一列举,详细配置可以参考官方文档。

2.2修改配置:
	注释掉bind的配置  protected-mode 改为no
	daemonize 改为yes
	设置密码requirepass 12345678
2.3使用客户端连接redis
1.在bin输入命令./redis-cli -p 6379 我这里是用的6379端口, 
//验证密码
[root@localhost bin]# ./redis-cli -p 6379
127.0.0.1:6379> auth 12345678 

3.Redis支持的数据类型和api使用

Redis支持的数据类型有String、hash、list、set、zset等

3.1 String类型的使用

String:说是字符串实际上可以是字符串(包括XML JSON),
还有数字(整形 浮点数),二进制(图片 音频 视频),最大不能超过512MB;
//set 插入一个键值对 此命令会产生覆盖效果,如果已经存在的键值对,使用此命令会覆盖掉原来的值。

//字符串存储  设置一个key为name 值为12345  设置10秒后过期,ex是以秒为单位,ps 以毫秒为单位
127.0.0.1:6379> set name 12345 ex 10 
127.0.0.1:6379> set name 12345 px 10000

//get 获取某个键的值

127.0.0.1:6379> get name
"12345"

//exists 查看某个键是否存在,存在返回1,不存在返回0;作为缓存使用时常用,判断缓存不存在再去数据库里面查

127.0.0.1:6379> exists name
(integer) 1

//del 删除某个键

//删除一个指定的键,返回的是删除的记录行
127.0.0.1:6379> del name
(integer) 1

//setnx 当键存在时,不允许插入;一些业务数据为了防止数据被覆盖使用此命令;这个功能和zookeeper的临时节点类似,可以用来实现分布式锁(Redisson 是redis官方推荐的一套完整分布式锁实现方案,感兴趣的朋友可以看一下自己去研究一下。)

//当name键存在时 插入失败返回0  不存在,插入成功返回1
127.0.0.1:6379> setnx name 12345
(integer) 1

//mset 一次性插入多个字符串;涉及到多个插入时尽量用这种方式,减少客户端与服务端的网络开销。

// 一次性插入 键为country 值为 china 和 键为city 值为chongqing 两个键值对。
127.0.0.1:6379> mset country china city chongqing
OK

//incr 自增,decr 自减 可以对整数类型的数据进行加减

127.0.0.1:6379> set age 18
OK
127.0.0.1:6379> incr age
(integer) 19
127.0.0.1:6379> decr age
(integer) 18

// incrby 增加指定数量 decrby 减少指定数量 同上,对数字类型的值进行加减

127.0.0.1:6379> set age 18
OK
127.0.0.1:6379> incrby age 2
(integer) 20
127.0.0.1:6379> decrby age 2
(integer) 18

// incrbyfloat 浮点型加法

127.0.0.1:6379> set score 18.2
OK
127.0.0.1:6379> incrbyfloat score 2.3
"20.5"

// append 字符串追加,类似于StringBuffer 的append()操作

127.0.0.1:6379> set name zhangsan
OK
127.0.0.1:6379> append name " is a teacher"
(integer) 21
127.0.0.1:6379> get name 
"zhangsan is a teacher"
3.2 hash类型的使用

hash实际就是string类型的键和value的映射表.说白了就是一个键对应多个key-value,特别适合用来存储对象,当然我们也可以把对象格式化成json字符串,直接存字符串。
hset 存储一条hash类型的数据

//设置一个键为user:1  name属性为zhangsan age属性为18 的hash类型数据
127.0.0.1:6379> hset user:1 name zhangsan age 18
(integer) 2

hget 获取某个键值对应的某一个属性

//获取键为 user:1 的name属性
127.0.0.1:6379> hget user:1 name
"zhangsan"

hmget 批量获取某个键值的多个属性

//获取键为 user:1 的name属性 和age属性
127.0.0.1:6379> hmget user:1 name age
1) "zhangsan"
2) "18"

可以看到我在上面专门用user:1作为键,并设置了 name 和age 属性。如果我们用mysql操作的话,就类似于 select name,age from user where id = 1这样的操作。user代表示user表,1代表是主键。我们用这种映射方式。把存在mysql的数据完美的存储到redis中。这种存储方式就是简单直观,合理使用可减少内存的消耗,缺点就是需要控制编码转换(redis内部会把所有存入数据转成redisObejct对象,而且根据数据类型、大小不一样分别有10种对应的编码方式。实际就是为了提高内存的利用率;反正键值和value都别太长,如果太长建议做拆分),如果不加控制hashtable会消耗更多的内存;除了hash还有一种方式直接存储对象,那就是利用序列化,这种方式内存使用率高,缺点就是我只改变对象的某一个值也需要反序列化整个对象,操作完之后再序列化到redis。序列化和反序列化有一定开销。如何取舍视实际情况而定。如果你的资源需要经常修改,推荐hash。

hdel 删除某个键值对应的某一个或多个字段

127.0.0.1:6379> hdel user:1 name 
(integer) 1

关于hash 的操作和string的操作大相庭径,只不过在指定键之后还得指定属性,命令在前面加一个h而已。这里就不再一一介绍。

3.3 list数据类型的使用

用来存储多个有序的字符串,一个列表最多可存2 的32次方-1个元素,因为有序,可以通过索引下标获取元素或某个范围内的元素列表
rpushlrange

// 向order列表插入 id1  id2 id3 3个字符串
127.0.0.1:6379> rpush order id1 id2 id3
(integer) 3
//去除order列表中的所有元素  0 -1 代表取出所有
127.0.0.1:6379> lrange order 0 -1
1) "id1"
2) "id2"
3) "id3"

lpushlrange

127.0.0.1:6379> lpush order1 id1 id2 id3
(integer) 3
127.0.0.1:6379> lrange order1 0 -1
1) "id3"
2) "id2"
3) "id1"

从上面我们可以看到 我们插入的顺序都是 id1 id2 id3 但是我们lrange 出来的顺序却不一样。这是因为这实际是一个双向链表,一个从左向右插入(lpush),一个从右向左插入(rpush)。所以我们两次lrange出来的结果顺序是反的。因为我们读的时候(lgange)都是从左往右读
如果不明白我们再看下面一个例子,刚刚我们rpush和lpush了一个order 列表元素都是 id1 id2 id3 现在我往里面插入一个元素.

linsert 在order列表插入一个元素,在id2元素之前 插入 id4 元素;
并在order1列表插入一个元素id4也在id2之前。

127.0.0.1:6379> linsert order before id2 id4
(integer) 4
127.0.0.1:6379> lrange order 0 -1
1) "id1"
2) "id4"
3) "id2"
4) "id3"
127.0.0.1:6379> linsert order1 before id2 id4
(integer) 4
127.0.0.1:6379> lrange order1 0 -1
1) "id3"
2) "id4"
3) "id2"
4) "id1"

因为lpush 个rpush 的顺序是反的,我们在同一个元素之前加入一个新元素,顺序还是反的;
lpop 从左边弹出一个元素

127.0.0.1:6379> lpop order1 
"id3"

rpop 从右边弹出一个元素

127.0.0.1:6379> lpop order
"id1"

利用rpushlpop 可以实现一个消息队列。(但是不推荐使用redis做消息队列,毕竟我们只是作为缓存使用,消息还是交给mq吧)list类型的数据操作还有其他的一些命令有lidnex 查看指定下标的元素、llen查看列表的长度或者列表中某个元素的长度、lset修改list中的元素、lrem删除list中指定数量的指定内容的元素等等操作。

//删除order集合中2个内容为id4的元素 返回受影响的个数
127.0.0.1:6379> lrem order1 2 id4
(integer) 2
3.4 set集合的使用

跟java中set集合不允许重复。redis也是一样,且set集合是无序的除了支持增删改查之外还支持集合的交集、并集、差集。在社交,推荐,共同爱好都可以用set集合来做。
sadd 新增元素

//在user的set集合中添加4个元素,返回受影响的个数
127.0.0.1:6379> sadd user zhangsan lisi wangwu zhaoliu
(integer) 4

smember 查询set集合中的元素,从下面查询结果中也可以看出set集合是无序的

127.0.0.1:6379> smembers user
1) "wangwu"
2) "zhangsan"
3) "zhaoliu"
4) "lisi"
//再次插入zhangsan 和lisi 两个元素到user集合中 发现返回是0,说明set集合是不允许重复的。
127.0.0.1:6379> sadd user zhangsan lisi
(integer) 0

srem 删除元素

//删除user集合中的wangwu元素
127.0.0.1:6379> srem user wangwu
(integer) 1

sismember 判断元素在集合中是否存在

//查询zhangsan 这个元素 在user 集合中是否存在,返回 1 是 0否
127.0.0.1:6379> sismember user zhangsan
(integer) 1

spop 随机弹出指定个数的元素。这玩意可以拿来做抽奖功能

//随机弹出一个元素,
127.0.0.1:6379> spop user 1
1) "lisi"

sinter 求两个集合的交集,在下面 我们可以看到user集合和user1两个集合的交集是zhangsan这个元素。

127.0.0.1:6379> smembers user
1) "zhangsan"
2) "zhaoliu"
127.0.0.1:6379> sadd user1 zhangsan wangwu
(integer) 2
127.0.0.1:6379> smembers user1
1) "wangwu"
2) "zhangsan"
127.0.0.1:6379> sinter user user1
1) "zhangsan"

sunion 求两个集合的并集,还是上面两个集合user1 和user 元素不变。两个集合的元素都只有两个,zhangsan这个元素两个集合都有,求并集就是3个元素。

127.0.0.1:6379> sunion user user1
1) "wangwu"
2) "zhangsan"
3) "zhaoliu"

sdiff 求两个集合的差集;还是上面两个集合,user 和user1 它们的差集分别是 zhaoliu 和wangwu

127.0.0.1:6379> sdiff user user1
1) "zhaoliu"
127.0.0.1:6379> sdiff user1 user
1) "wangwu"

store 取集合操作,不管是取交集,并集,差集。store的操作就是将取出来的集合重新生成另外一个集合。对应的命令就是sinterstoresunionstoresdiffstore

//取出user 和 user1 的差集 然后放入到 usersdiff 集合中
127.0.0.1:6379> sdiffstore usersdiff user user1
(integer) 1
127.0.0.1:6379> smembers usersdiff
1) "zhaoliu"
3.5 zset集合的使用

zset是一个有序的集合,它实际是通过一个分值的方式实现的排序。利用zset可以实现一个点赞排名的功能。下面就模拟实现一个点赞计数的操作。
zadd 添加一个zset集合 下面的操作可以理解为记录20180808 用户的点赞数。

//创建一个键为user:1:20180808 的集合 添加一个元素为zhangsan 分值为0 lisi分值为0
127.0.0.1:6379> zadd user:1:20180808 0 zhangsan
(integer) 1
127.0.0.1:6379> zadd user:1:20180808 0 lisi
(integer) 1

zincrby 为某个元素增加一个指定分值;说白了就是每一个点赞就zincrby 一下

127.0.0.1:6379> zincrby user:1:20180808 1 zhangsan
"1"

zscore 获取集合中某个元素的分值,就是获取某个用户的点赞数。

127.0.0.1:6379> zscore user:1:20180808 zhangsan
"1"

zrange 查看排名

127.0.0.1:6379> zrange user:1:20180808 0 -1 withscores
1) "lisi"
2) "0"
3) "zhangsan"
4) "1"

上面介绍了关于redis不同数据类型以及相关的api操作。下面进行介绍我们常用的redis的功能。

4.Redis键管理

rename 重命名键

//将键 user:1:20180808 这个键改为 user:20180808
127.0.0.1:6379> rename user:1:20180808 user:20180808
OK

expire 设置键值过期时间 ,一些限时的功能就可以通过这个实现验证码时效、session过期时间等。

127.0.0.1:6379> expire user 30
(integer) 1

expireat 设置一个键的固定过期时间,参数为时间戳 通过这个可以实现限时领券的功能

127.0.0.1:6379> expireat user:1 1630481350920
(integer) 1

persist 取消一个键的计时过期,就是把我们已经设置了过期时间的键,取消计时过期,设为永久有效。

127.0.0.1:6379> persist age
(integer) 1

migrate 键的迁移,这个功能实现多个redis之间的数据迁移。但是要注意的是redis之间网络一定要通,就是redis配置的bind配置的ip之间一定要通,不然用不了。

//把192.168.0.6这台机器中的name键 复制到 192.168.0.4 这台机器中的第0个库 超时时间为1000
192.168.0.6:6379> migrate 192.168.0.4 6379 name 0 1000 copy
OK

3.总结

这篇文章主要介绍了,redis的安装启动、部分配置项以及主要的api的使用。关于redis的功能还有很多,比如持久化,主从复制,哨兵机制实现高可用,保证redis节点发生故障和自动转移等。关于redis的javaapi这里未做介绍,实际和使用redis-cli没什么差别,说白了就是把上面这些命令封装了成了方法而已。本片文章的介绍就到这里。后续再详细介绍redis其他一些功能和具体的应用场景。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值