SpringBoot 整合Redis缓存(下)
Redis基本操作
安全设置
因为互联网上出现了大量的NoSQL数据库被不安全使用而导致的安全问题,因此使用NoSQL的第一步就是设置访问密码,打开redis.conf
文件,添加一行密码
requirepass 123456
以上配置需要重启Redis服务,并且使用当前已经修改过的conf文件,以下我用Windows环境
redis-server.exe redis.windows.conf
下面我们来进行测试,我们重新使用redis-cli进行连接,使用ping命令,会发现需要授权
我们使用auth [password]
进行授权
基本操作
set
命令可以添加/覆盖一个字符串或者数字类型get
命令可以获取已经添加了的key值
set platform:info "test info"
->ok
get platform:info
->"test info"
这里进行一下解释,Redis或者Spring Boot中的key,通常都是包含逻辑上的命名空间,用符号:
分开,比如:spring:session:xxx
对于数字类型的字符串,还有以下命令可以对其进行运算操作:
DECR/INCR
:数字类型数据自减和自增DECRBY/INCRBY
:数字类型数据减去某个指定的整数或者增加某个指定的整数INCRBYFLOAT
:数字增加一个浮点数,负数表示减去
举个例子
set platform:version 1
->OK
incrby platform:version 2
->(integer)3
keys
Redis是Key-Value数据库,在Redis中,Key是二进制数,因此字符串和图片都是可以作为Key,可以通过keys命令来进行查询Redis中所有的Key
keys platform:*
->"platform:version"
Keys后面可以使用*
或者?
:
platform:*
:匹配"platform:"开头的keyplat?orm
:匹配platform和其他的带有plat?(占位符)orm的key*
:查询所有的keys
可以通过exist来判断key是否存在
exits platform:version
->(integer)1
返回1表示存在,0表示不存在
del和ttl
del [key]
:该命令可以指定删除keyttl [key]
:该命令可以查询到key的存活时间expire [key] [time]
:该命令指定key可以存活的时间,单位为s(秒)
Redis中的数据结构
Redis List
Redis List类型类似Java的LinkedList,通过链表来完成,向其添加元素速度非常快,但按照索引方式获取元素比较慢,因此List结构适合哪种大数据量,要求插入速度极快的场景
-
rpush [key] [value]
:可以将多个值放入list结构的尾部,可以理解成将值插入list的右边,同理lpush
是可以将多个值放入list结构的头部,也可以理解成从list结构的左边插入 -
lrange [key] [start] [end]
:能够从左到右显示指定范围的列表,最后两个参数是列表的范围,从列表末尾开始 -
rpop/lpop [key]
:该命令可以从了表的末尾/开头取出一个元素(注意,此处元素被取出之后,在原来的结构中就不存在被取出的当前元素了) llen [key]
:该命令用来返回List结构的长度
举个例子,比如消息服务,我们可以通过rpush
来追加消息,其他客户端可以通过lpop/rpop
来读取List消息,消息读取后就不存在了;再比如一个网站的热点新闻列表没记录可以通过lpush
放到新闻列表中,然后访问的用户可以通过lrange [key] 0 9
来读取最新的10条记录
Redis Hash
Redis Hash类似Java的HashMap,允许存放多个Key-Value,Spring Boot在Spring Session中即采用了Hash结构来存放用户的Session数据,用以实现WEB系统的水平扩展
Redis Hash:
hset [key] [filed] [value]
:给指定的Key设置一个字段值,如果值已经存在,则覆盖,返回0表示失败,返回1表示成功hget [key] [filed]
:获取指定Key的filed字段的值,如果不存在,返回nilhexists [key] [filed]
:判断指定的Key的filed字段是否存在,返回1表示存在,0表示不存在hgetall [key]
:返回Key所指定的hash所有字段名hdel [key] [filed] ..
:删除多个字段
127.0.0.1:6379> del platform:info
(integer) 1
127.0.0.1:6379> hset session:test name seale
(integer) 1
127.0.0.1:6379> hget session:test name
"seale"
127.0.0.1:6379> hset session:test ip 127.0.0.1
(integer) 1
127.0.0.1:6379> hkeys session:test
1) "name"
2) "ip"
127.0.0.1:6379> hgetall session:test
1) "name"
2) "seale"
3) "ip"
4) "127.0.0.1"
Hash字段支持递增计算,这跟原始类型的操作一样,是原子操作
hincrby [key] [filed] [value]
:对Key指定的Hash数据中的filed的值进行计算,增加整型valuehincrbyfloat [key] [filed] [value]
:对Key指定的Hash数据中的field值进行计算,增加浮点数value
127.0.0.1:6379> hset website test 0
(integer) 1
127.0.0.1:6379> hincrby website test 1
(integer) 1
127.0.0.1:6379> hincrby website test 1
(integer) 2
Redis Set
Redis Set 和Java.util.Set类似,代表了元素不可重复的集合,Redis的Set出了元素添加删除操作,还包含了集合的并集,交集功能,可以用于统计访问网站所有的ip,或者统计网站作者共同的粉丝,听众等功能,常用的命令有:
sadd [key] [member] ..
:添加元素,可以添加多个用空格隔开srem [key] [member] ..
:删除元素smembers [key]
:返回一个集合中的所有元素sinter [key1] [key2]
:返回练个集合共同的元素,求交集sinterstore [key1] [key2] [key3]
:将key2和key3的交集放在key1中sunion [key1] [key2]
:返回一个合并后的集合sunionstore [key1] [key2] [key3]
:将key2和key3的并集放到key1中
Redis Pub/Sub
Redis除了NoSQL特性,还提供了简单的消息服务,支持publish/subscribe。Redis客户端可以订阅一个或者多个Channel(频道),这种行为被称为subscribe,其他Redis客户端向这些Channel发送消息,被称为publish,订阅这些频道的客户端能够接受到这些消息
publish/subscribe消息模式很好的进行解耦了消息发送者和消息接受者。消息订阅者不需要知道发送者,发送者也不需要知道消息的接收者,发送者发送的消息将被所有的消息订阅者接受
publish/subscribe模式在Spring Boot中可以用用于事件通知,如配置文件更新,缓存更新等等
Redis还提供了订阅指定的模式,使用psubscribe
命令:
psubscribe news.*
上面例子的意思为:订阅所有news.开头的频道
psubscribe支持的表达式
news.*
:所有news.
开头的频道news-?
:订阅news-xx频道news[123]
:订阅news-1/news-2/news-3频道
命令:
subscribe [channelname]
:订阅频道psubscribe [pattern]
:根据表达式订阅频道publish [channel] [message]
:给指定频道发送message
Spring Boot中集成Redis
在Maven的pom中引入
<!--Redis-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
之后在application.yml中进行一些基本配置
redis:
host: 127.0.0.1
password: 123456
port: 6379
# 最大连接数
jedis:
pool:
max-active: 10
属性max-active指定了Spring Boot应用的最大连接数,0表示无限制
StringRedisTemplate
简介
StringRedisTemplate是Spring Boot内置的操作Redis的Api,另外一个内置的Api是RedisTemplate,StringRedisTemplate是Api假定所有的数据类型都是字符类型,比如key是字符串,value也是字符串,List/Hash的元素值也是字符串,对于常见的Spring Boot应用系统来说,使用字符串也已经足够了,而且也能方便的通过客户端管理工具进行管理
StringRedisTemplate继承了RedisTemplate,与其父类不同的是重新设置了序列化策略,使用StringRedisSerializer类来序列化K-V,以及List/Hash/Set等数据结构中的元素
测试
为了测试是否集成成功,我们使用内置的StringRedisTemplate来进行测试,完成一个简单的Redis操作
我们编写一个Controller类来进行简单的验证
package com.eendtech.boot.bootExample.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @ author Seale
* @ Description:
* @ QQ:1801157108
* @ Date 2019/6/29 22:39
*/
@RestController
@RequestMapping(value = "/strredis")
public class RedisStringController {
@Autowired
private StringRedisTemplate stringRedisTemplate;
@RequestMapping("/set/{para}")
public String env(@PathVariable String para){
stringRedisTemplate.opsForValue().set("testenv",para);
String str = stringRedisTemplate.opsForValue().get("testenv");
return str;
}
}