redis+springboot集成-data整合

首先下载redis,及其可视化工具,这里是window本机的运行方式,如果是linux这些云服务器的话,则需要改一下配置文件如设置后台运行、支持远程访问等等,举个例子下载并解压:

 wget http://download.redis.io/releases/redis-4.0.4.tar.gz
 tar -zxvf redis-4.0.2.tar.gz

更改配置文件redis.conf

注释掉bind 127.0.0.1这句话,添加 daemonize yes,添加密码:requirepass 密码,这些配置完以后,可以使用make命令安装,有时候会出现缺少依赖什么的,这时候上网搜一下继续搞,然后安装好以后,在安装的目录下启动

src/redis.server redis.conf

然后这里采用本地window的安装。

redis支持的数据结构有很多,常见如字符串Strings,如在客户端运行该命令,则是新增一个叫test的键对应的值为helloworld

有几个常用的命令用于测试后面的类型键

键名以key表示
ttl key  查看该键剩余时间
exists key 返回是否存在该键
del key 删除该键
type key 返回该键类型
expire key 设置存活时间(EX PX) 

字符类型:

 set test helloworld 

后面还可以跟一些参数如

EX 存活时间(单位:s)
PX 存活时间(单位:ms)
XX|NX (XX对键已存在才操作,NX不存在才操作)
例子1:即存活时间为3秒的只有当这个键存在才操作
set mskey "ok" PX 3000 XX
例子2:
set skey "hello" EX 30 NX

列表Lists(链表实现),

lpush 从链表头加入
rpush 从链表尾加入
lrange 取值
rpop、lpop 取值并删除
brpop、blpop 阻塞的取值删除
brpush、blpush 阻塞的添加值
ltrim 从左边截取指定长度
//一次传入多个值
rpush mylist 1 2 3 
lpush mylist 1 2 3 
rpush 1 2 3 则是由 1开始 2连着1 3连着2 从尾部添加 1<-2<-3
lpush 1 2 3 则是从头添加,此时的头为1   3<-2<-1<-1<-2<-3

//这里的lrange是闭合区间,-1代表倒数第一个。
lrange mylist 0 -1
返回:
1) "3"
2) "2"
3) "1"
4) "1"
5) "2"
6) "3"

rpop mylist 
从尾节点拿,所以得到 3

brpop、blpop  brpush brpush 则是阻塞的添加和删除,消费端采用rpop 生产端采用lpush可以用作消息队列,这里开两个客户端模仿:

//非阻塞版本,向链表左边(队列头)发送消息,链表右端(队列尾)消费
lpush channel product-messager

rpop channel

//消费第一个非空的list,比如list1是空的,则到channel里面找,0为无限等待,其他数字则为超时时间
brpop list1 channel 0

超时无消息返回:

集合Sets,

sadd key menber //添加一个类型为set的key,可以添加多个成员
scard key /获取总数
smembers //获取所有元素
srandmember  key count//随机获取count个元素
sdiff key1 key2 //去除k1里面在k2的值
sdiffstore destination key key1 key2 //把去除k1里面在k2的值放到一个新的key上
sinter key1 key2 //取key1,key2交集 
spop key count 随机移除count个元素
srem key [menber..] //去除成员

哈希Hashes:

 hset people name hello (hset key field value) //添加

 hget people name(hget key field) //获取

 hdel people name //删除某个属性,不是整个键
 
 hmset people name hello country chinese //添加多个值

 hgetall people //获取所有属性及其值

有序集合Sorted sets

zadd key [NX|XX] CH score member
//score为member的分值,是double类型的,然后sorted set根据这个来排序, CH代表更新分值或者插入会返回1,如果分值不变则返回0
//顺序0第一个 -1倒数第一个
zrange key start stop

zpopmax key //弹出最大
zpopmin key //弹出最小
zrem key member//删除成员

还有用于计数的HyperLogLog,用于支持存储地理位置的Geo

更多的用法请查阅官方文档,也有中文版:redis.io,关于主从、哨兵、集群的配置网上有很多优秀的文章。有兴趣可以捣鼓弄一下。这里仅仅是入门说一下用法。

添加依赖:


			org.springframework.boot
			spring-boot-starter-data-redis
		

配置:这里还可以进行集群、线程数、密码等等的配置

spring:
  redis:
    port: 6379
    host: 127.0.0.1

比较常用的是StringRedisTemplate和RedisTemplate,他们的关系如下:

redis+springboot集成-data整合_第1张图片

StringRedisTemplate主要用于操作key为字符串类型,相对于redistemplate处理字符更为高效

而RedisTemplate则可以操作key为任意对象。

基本用法:根据业务需求,op开头的即为操作,然后其他的删除、过期、ttl等等就调用template里面定义好的方法

StringRedisTemplate的opForValue可用的api如下

redis+springboot集成-data整合_第2张图片

其中比较常用的是set setifPresent get getAndSet

list支持的操作有

redis+springboot集成-data整合_第3张图片

set支持的操作有

redis+springboot集成-data整合_第4张图片

sorted set

redis+springboot集成-data整合_第5张图片

hashs

redis+springboot集成-data整合_第6张图片

这些都是默认操作类里的方法,按照业务需求去调用,因为实在太多了,对要进行redis操作的类里面注入template就可以使用了(举两个例子充充字数)

package com.gdut.redisdemo.operate;

import com.gdut.redisdemo.VO.UserVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.*;
import org.springframework.stereotype.Component;

import java.util.Arrays;
import java.util.List;

/**
 * @author lulu
 * @Date 2019/6/21 23:20
 */
@Component
public class Operation {
    @Autowired
    private StringRedisTemplate stringRedisTemplate;
    @Autowired
    private RedisTemplate redisTemplate;

    public void opForString(){
stringRedisTemplate.opsForValue().set("xx","xx");
    }
public void opForHash(){
    HashOperations operations=redisTemplate.opsForHash();
    //不会插入
    operations.putIfAbsent("hash","name",null);
}
public void opForList(){
    List userList=Arrays.asList(new UserVO("1",20),new UserVO("2",21),new UserVO("3",22));
    ListOperations operations=redisTemplate.opsForList();
    operations.leftPushAll("list",userList);
    operations.range("list",0,-2).stream().forEach(System.out::println);
    for(long i=operations.size("list");i>0;i--){
        UserVO u=operations.leftPop("list");
        System.out.println(u.toString());
    }
    redisTemplate.delete("list");
}


}
 @Autowired
    private StringRedisTemplate stringRedisTemplate;
 @Autowired
    private Gson gson;

//这里通过对象转json字符串存在redis当缓存
public ResultVO getGroup(HttpServletRequest request) {
    try {
        
        List groupList=null;
        if(stringRedisTemplate.opsForValue().get("mastergroup")!=null){
            groupList=gson.fromJson(stringRedisTemplate.opsForValue().get("mastergroup"),new TypeToken>(){}.getType());
        }else{
            groupList = adminService.listCustomerGroup().stream().map(e->convert(e)).collect(Collectors.toList());
            String group=gson.toJson(groupList);
            stringRedisTemplate.opsForValue().set("mastergroup",group);
        }
        Map map = new HashMap();
        map.put("groupList", groupList);
        return new ResultVO(ResultEnum.SUCCESS, map);
    } catch (Exception e) {
        return new ResultVO(ResultEnum.SUPER_GROUP_ERROR.getCode(), ResultEnum.SUPER_GROUP_ERROR.getMessage() + e.getMessage());
    }

}

 

你可能感兴趣的:(redis)