首先下载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,他们的关系如下:
StringRedisTemplate主要用于操作key为字符串类型,相对于redistemplate处理字符更为高效
而RedisTemplate则可以操作key为任意对象。
基本用法:根据业务需求,op开头的即为操作,然后其他的删除、过期、ttl等等就调用template里面定义好的方法
StringRedisTemplate的opForValue可用的api如下
其中比较常用的是set setifPresent get getAndSet
list支持的操作有
set支持的操作有
sorted set
hashs
这些都是默认操作类里的方法,按照业务需求去调用,因为实在太多了,对要进行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());
}
}