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:"开头的key
  • plat?orm:匹配platform和其他的带有plat?(占位符)orm的key
  • *:查询所有的keys

可以通过exist来判断key是否存在

exits platform:version
->(integer)1

返回1表示存在,0表示不存在

del和ttl

  • del [key]:该命令可以指定删除key
  • ttl [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字段的值,如果不存在,返回nil
  • hexists [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的值进行计算,增加整型value
  • hincrbyfloat [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;
    }

}


本作品采用知识共享署名 4.0 国际许可协议进行许可。

如果可以的话,请给我钱请给我点赞赏,小小心意即可!

Last modification:July 19, 2019
If you think my article is useful to you, please feel free to appreciate