在Linux上部署Redis
安装版本为redis-7.0.13
1、安装Redis yum仓库
下载yum仓库
wget http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
安装yum仓库
rpm -ivh remi-release-7.rpm
2、安装Redis
yum --enablerepo=remi -y install redis-7.0.13
3、配置Redis允许远程访问
Redis服务默认只允许本地访问,若需要进行远程访问,需要做出以下配置。
修改Redis配置文件
vim /etc/redis/redis.conf
修改如下参数
#监听所有网络接口,默认只监听localhost
bind 0.0.0.0
#关闭保护模式,默认开启。开始保护模式后,远程访问必须进行认证后才能访问。
protected-mode no
4、启动Redis
执行以下命令启动Redis
systemctl start redis
执行以下命令查看Redis的运行状态
systemctl status redis
执行以下命令设置Redis开机自启
systemctl enable redis
Redis概述
1、Redis定义
Redis(Remote Dictionary Server)是一个基于内存的键值对存储系统,常用作缓存服务。由于Reids将数据都保存在内存中,因此其读写性能十分惊人,同时,为保证数据的可靠性,Redis会将数据备份到硬盘上,用于故障发生时的数据恢复。
2、Redis特点
-
高性能:Redis主要将数据存储在内存中,因此读写速度非常快,适合对速度有较高要求的场景。
-
支持多种数据结构:Redis中键值对的值(Value)支持多种数据结构,如字符串、哈希表、列表、集合等,这使得它可以应用于多种不同的场景。
-
持久化:Redis可以通过定期快照或者实时记录写操作日志的方式将内存中的数据持久化到硬盘,确保数据在重启后不会丢失。
-
灵活的数据过期策略:可以为每个键设置过期时间,一旦过期,Redis会自动删除。
Reids客户端
1、命令行客户端
Reids提供了一个命令行客户端redis-cli
,我们可以使用它连接到Redis服务器,然后通过命令与服务器进行各种交互。
(1)、启动客户端
redis-cli -h 127.0.0.1 -p 6379
-
-h <hostname>
选项用于声明Redis服务器的主机名或IP地址,默认值为127.0.0.1
。 -
-p <port>
选项用于声明Redis服务器监听的端口号,默认值为6379
。
测试连接:ping命令,若连接正常,则会返回pong
(2)、退出客户端
quit
命令可用于断开客户端与服务端的连接,并退出客户端
2、图形化客户端
Redis官方推荐的图形化客户端为RedisInsight,该客户端开源免费,且功能强大
(1)、选择配置数据库连接
(2)、填写连接信息,并测试连接,通过后保存连接
(3)、点击创建好的连接
工作界面如下
Redis常用数据类型及命令
通用命令
查看所有键
keys pattern
pattern用于匹配key,其中若pattern为 *
表示任意个任意字符,为 ?
表示一个任意字符。
查看键总数
dbsize
若该键存在则返回1,不存在则返回0
判断键是否存在
exists key
删除键
del key [key ...]
返回值为删除键的个数,若删除一个不存在的键,则返回0
查询键的剩余过期时间
ttl key
ttl
的含义为time to live,用于查询一个定时键的剩余存活时间,返回值以秒为单位。若查询的键的未设置过期时间,则返回-1
,若查询的键不存在,则返回-2
数据库管理命令
Redis默认有编号为0~15的16个逻辑数据库,每个数据库之间的数据是相互独立的,所有连接默认使用的都是0号数据库。
切换数据库
select index
若index超出范围,会报错
清空数据库
flushdb
命令会清空当前所选用的数据库,flushall
命令会清空0~15号所有的数据库。
string类型
Redis中的string类型保存的是字节序列(Sequence of bytes),因此任意类型的数据,只要经过序列化之后都可以保存到Redis的string类型中,包括文本、数字甚至是一个对象。
常用命令
set
命令用于添加string类型的键值对
SET key value [NX|XX] [EX seconds|PX milliseconds]
各选项含义如下
-
NX:仅在key不存在时set
-
XX:仅在key存在时set
-
EX seconds:设置过期时间,单位为秒
-
PX milliseconds:设置过期时间,单位为毫秒
get
命令用于获取某个string类型的键对应的值
GET key
incr
命令用于对数值做自增操作
INCR key
若key对应的value是整数,则返回自增后的结果,若不是整数则报错,若key不存在则创建并返回1
decr
命令用于对数值做自减操作
DECR key
若key对应的value是整数,则返回自减后的结果,若不是整数则报错,若key不存在则创建并返回-1。
list类型
list类型可用于存储多个string类型的元素,并且所有元素按照被添加的顺序存储。
常用命令
添加元素
lpush
命令用于向list左侧添加元素
lpush key element [element ...]
rpush命令用于向list右侧添加元素
rpush key element [element ...]
linsert命令用于向list指定位置添加元素
linsert key before|after pivot element
查询元素
lindex命令用于获取指定索引位置的元素
lindex key index
index从左到右依次是0,1,2...,从右到左依次是-1,-2,-3...
lrange
命令用于获取指定范围内的元素列表
lrange key start stop
删除元素
lpop
命令用于移除并返回list左侧元素
lpop key [count]
rpop
命令用于移除并返回list右侧的元素
rpop key [count]
lrem
命令用于移除list中的指定元素
lrem key count element
说明:count参数表示要移除element元素的个数(list中可以存在多个相同的元素),count的用法如下
-
若count>0,则从左到右删除最多count个element元素
-
若count<0,则从右到左删除最多count(的绝对值)个element元素
-
若count=0,则删除所有的element元素
修改元素
lset
命令可用于修改指定索引位置的元素
lset key index element
其他
llen
命令可用于查看list长度
llen key
set类型
和list类型相似,set类型也可用来存储多个string类型的元素,但与list类型不同,set中的元素是无序的,且set中不会包含相同元素。
常用命令
集合内
sadd命令用于向set中添加元素
sadd key member [member ...]
smember命令用于查询set中的全部元素
smembers key
srem命令用于移除set中的指定元素
srem key member [member ...]
spop命令随机移除并返回set中的n个元素
spop key [count]
srandmember命令随机返回set中的n个元素
srandmember key [count]
scard命令用于查询set中的元素个数
scard key
sismember命令用于元素是否在set中
sismember key element
集合间
sinter命令用于计算多个集合的交集
sinter key [key ...]
sunion命令用于计算多个集合的并集
sunion key [key ...]
sdiff命令用于计算多个集合的差集
sdiff key [key ...]
hash类型
hash类型类似于Java语言中的HashMap
,可用于存储键值对。
常用命令
hset 命令用于向hash中增加键值对
hset key field value [field value ...]
hget命令用于获取hash中某个键对应的值
hget key field
hdel命令用于删除hash中的指定的键值对
hdel key field [field ...]
hlen命令用于查询hash中的键值对个数
hlen key
hexists命令用于判断hash中的某个键是否存在
hexists key field
hkeys命令用于返回hash中所有的键
hkeys key
hvals命令用于返回hash中所有的值
hvals key
hgetall命令用于返回hash中所有的键与值
hgetall key
zset类型
zset(sorted set)被称为有序集合,同set相似,zset中也不会包含相同元素,但不同的是,zset中的元素是有序的。并且zset中的元素并非像list一样按照元素的插入顺序排序,而是按照每个元素的分数(score)排序。
常用命令
zadd命令用于向zset中添加元素
ZADD key [NX|XX] score member
-
NX:仅当member不存在时才add
-
XX:仅当member存在时才add
zcard命令用于计算zset中的元素个数
zcard key
zscore命令用于查看某个元素的分数
zscore key member
zrank/zrevrank 命令用于计算元素的排名,其中zrank按照score的升序排序,zrevrank则按照降序排序
zrank/zrevrank key member
zrem命令用于删除元素
zrem key member [member ...]
zincrby命令用于增加元素的分数
zincrby key increment member
zrange命令用于查询指定区间范围的元素
zrange key start stop [byscore] [rev] [limit offset count] [withscores]
-
start/stop:用于指定查询区间,但是在不同模式下,其代表的含义也不相同
-
默认模式下,
start~stop
表示的是名次区间,且该区间为闭区间。名次从0开始,且可为负数,-1表示倒数第一,-2表示倒数第二,以此类推。 -
byscore模式下(声明了byscore参数),则
start~stop
表示的就是分数区间,该区间默认仍为闭区间。在该模式下,可以在start
或stop
前增加(
来表示开区间,例如(1 (5
,表示的就是(1,5)
这个开区间。除此之外,还可以使用-inf
和+inf
表示负无穷和正无穷。
-
-
byscore:用于切换到分数模式
-
rev:表示降序排序。在byscore模式下使用rev参数需要注意查询区间,start应大于stop。
-
limit:该选项只用于byscore模式,作用和sql语句中的limit一致
-
withscores:用于打印分数
SpringBoot整合Redis
Spring Data Redis概述
Spring Data Redis 是Spring大家族中的一个子项目,主要用于Spring程序和Redis的交互。它基于的Redis Java客户端(Jedis和Lettuce)做了抽象,提供了一个统一的编程模型,使得Spring程序与Redis的交互变得十分简单。其中RedisTemplate
类封装了与Redis进行的交互的各种方法,我们主要用使用它与Redis进行交互。
Spring Data Redis快速入门
1、创建SpringBoot项目(自行创建)
2、引入Maven依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
3、配置application.yml文件
spring:
data:
redis:
host: 192.168.10.101
port: 6379
database: 0
4、RedisTemplate使用
由于spring-boot-starter-data-redis
中提供了RedisTemplate
的自动配置,所以我们可以将RedisTemplate
注入自己的类中。
@SpringBootTest
public class TestRedisTemplate {
@Autowired
private RedisTemplate redisTemplate;
@Test
public void testRedisTemplate() {
}
}
相关使用的方法介绍:
redisTemplate.opsForValue() | 操作string类型的方法 |
redisTemplate.opsForList() | 操作list类型的方法 |
redisTemplate.opsForSet() | 操作set类型的方法 |
redisTemplate.opsForHash() | 操作hash类型的方法 |
redisTemplate.opsForZSet() | 操作zset类型的方法 |
@SpringBootTest
public class TestRedisTemplate {
@Autowired
private RedisTemplate redisTemplate;
@Test
public void testSet() {
redisTemplate.opsForValue().set("key1", "value1");
}
@Test
public void testGet() {
String result = (String) redisTemplate.opsForValue().get("key1");
System.out.println(result);
}
@Test
public void testDel() {
redisTemplate.delete("key1");
}
}
5、序列化问题
问题一
使用RedisTemplate向Redis中增加一个键值对
redisTemplate.opsForValue().set("key2","value2");
使用RedisTemplate查询key2所对应的value,有结果
redisTemplate.opsForValue().get("key2");
使用命令行客户端查询key2所对应的value,无结果
get key2
问题二
在图形化客户端或者命令行客户端观察key2,显示异常
命令行客户端中的key2显示如下
问题说明
根本原因:Redis中的key和value均是以二进制的形式存储的,因此客户端输入的key和value都会经过序列化之后才发往Redis服务端。而RedisTemplate所使用序列化方式和命令行客户端采用序列化方式不相同,进而导致序列化之后的二进制数据不同,所以才会导致上述的现象。
6、StringRedisTemplate使用
StringRedisTemplate
使用的序列化器和命令行所使用的序列化器是相同的。因此可以使用StringRedisTemplate
代替RedisTemplate
解决上述问题。
@SpringBootTest
public class TestStringRedisTemplate {
@Autowired
private StringRedisTemplate redisTemplate;
@Test
public void testSet() {
redisTemplate.opsForValue().set("key4", "value4");
}
@Test
public void testGet() {
String result = redisTemplate.opsForValue().get("key4");
System.out.println(result);
}
@Test
public void testDel() {
redisTemplate.delete("key4");
}
}