看文章之前你需要了解Redis的数据类型 和数据类型的 相关方法
有不懂的 联系 qq:185624592
源码地址:https://gitee.com/GuoZG0328/jpa
项目架构和文件pom 配置 都在我上一篇:https://blog.youkuaiyun.com/gzgmyj/article/details/81127518
我这边简单介绍一下:
Redis支持五种数据类型:String(字符串),hash(哈希),list(列表),set(集合),zset(有序集合)
相关方法:
1.String(字符串):String是resid最基本的类型,一个key对应一个value。String类型是二进制安全的。string中可以包含任何数据。
set:添加/覆盖一个字符串或者数组类型
get:获取值
mget:获取多个key的值
DECR/INCR:数字类型的数据自增减和自增
DECRBY/INCRBY:数字类型数据减去某个指定的整数和增加某个指定的整数
INCRBYELOAT:数值类型增加一个浮点数,负数表示减去
2.list(列表):类似java的LinkedList,通过链表来完成。像添加元素速度非常快,但取元素速度非常慢。因此list结构适合大数据量要求插入速度极快的场景。
rpush:将多个值放入list尾部(右边)
lpush:将多个值放入list头部(左边)
lrange:能从左到右实现指定违反的列表
rpop:从list尾部抽取出一个元素
lpop:从list头部抽取一个元素
brpop/blpop:带阻塞的pop命令
llen:获取list长度
3.Hash(哈希):Redis中hash是一个键值(key=>value)对集合。hash是一个string类型的field和value的映射表,hash特别适合存储对象。
hset key filed value:给指定的key设置一个字段值,如果值已经存在,则覆盖。返回0表示失败,返回1表示成功。
hget key filed:获取指定key的field字段的值,如果不存在,返回nil。
hexists key field:判断指定的key的field字段是否存在,不存在返回0,存在返回1。
hkeys key:返回key所指定的hash所有的字段名。
hgetall key:返回所有的字段名和字段值
hdel key field:删除多个字段值
hincby key field value:对key指定的hash数据中的field的值进行计算,增加整型value
hincbyfloat key field value:对key指定的hash数据中的field的值进行计算,增加浮点数value
具体详细的 翻阅相关资料 这里不作说明
看代码:
简单的操作一下String类型 和list类型的缓存 来做说明
这是我封装的 方法接口
package com.example.jpa.service.redis;
import java.util.List;
public interface RedisService {
/**
* 向Redis中存放字符串
*
* @param key
* @param value
*/
void set(String key, Object value);
/**
* 向Redis中存放字符串[并设置过期时间]
*
* @param key
* @param value
* @param expire 单位s
*/
void set(String key, Object value, Long expire);
/**
* 根据key值获取数据【操作字符串】
*
* @param key
* @return
*/
Object get(String key);
/**
* 删除指定的键值【操作字符串】
*
* @param key
* @return
*/
void delete(String key);
/**
* 添加数据到list的顶部【操作List】
*
* @param key List名称
* @param value 存放的数值
* @return 存放完毕之后,当前List的长度
*/
Long lpush(String key, String value);
/**
* 获取List集合中的数据【操作List】
*
* @param key List名称
* @return list中存放的数据
*/
List<Object> range(String key);
/**
* 向List集合中存放集合
*
* @param key 被操作的List
* @param list 需要添加的List
* @return 存放完毕之后,当前List的长度
*/
Long lPushAll(String key, List<Object> list);
/**
* 移除List中的元素
*
* @param key 被操作的List
* @param count 要删除的元素个数【为负数表示从尾部,向头部删除;正数则相反】
* @param value 要删除的元素值
* @return 移除完毕之后,当前List的长度
*/
Long remove(String key, long count, Object value);
}
这是具体实现:
包括新增缓存 删除 之类的
package com.example.jpa.service.redis.impl;
import java.util.List;
import java.util.concurrent.TimeUnit;
import javax.annotation.Resource;
import com.example.jpa.service.redis.RedisService;
import org.springframework.data.redis.core.ListOperations;
import org.springframework.data.redis.core.RedisOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.stereotype.Service;
@Service
public class RedisServiceImpl implements RedisService {
@Resource
private RedisTemplate<String,Object> redisTemplate;
/**
* 获取操作字符串的ValueOperations
*/
public ValueOperations<String,Object> getValueOperations(){
ValueOperations<String,Object> vo = redisTemplate.opsForValue();
return vo;
}
@Override
public void set(String key, Object value) {
getValueOperations().set(key, value);
}
@Override
public Object get(String key) {
return getValueOperations().get(key);
}
@Override
public void delete(String key) {
RedisOperations<String, Object> operations = getValueOperations().getOperations();
operations.delete(key);
}
public Long lpush(String key, String value){
//获取操作list的对象
ListOperations<String, Object> opsForList = redisTemplate.opsForList();
Long length = opsForList.leftPush(key,value);
return length;
}
@Override
public List<Object> range(String key) {
//获取操作list的对象
ListOperations<String, Object> opsForList = redisTemplate.opsForList();
return opsForList.range(key,0,-1);
}
@Override
public Long lPushAll(String key, List<Object> list) {
//获取操作list的对象
ListOperations<String, Object> opsForList = redisTemplate.opsForList();
return opsForList.leftPushAll(key,list);
}
@Override
public Long remove(String key, long count, Object value) {
//获取操作list的对象
ListOperations<String, Object> opsForList = redisTemplate.opsForList();
return opsForList.remove(key,count,value);
}
@Override
public void set(String key, Object value, Long expire) {
redisTemplate.opsForValue().set(key,value);
//设置过期时间
redisTemplate.expire(key,expire,TimeUnit.SECONDS);
}
}
首先是操作string类型的缓存:
新增一个自定义key的缓存:
这是controller 使用了set方法
这样keys1的缓存就保存在了 redis当中
/**
* 根据key 添加缓存
* @return
*/
@RequestMapping("/set")
@ResponseBody
public String setredis(){
User user=new User();
user.setId(100000001);
user.setName("哈哈哈");
user.setPassword("123456");
redisService.set("keys1",user);
return "set redis success";
}
我们可以通过命令来查看他:
添加成功 我们也可以通过代码的方式 获取到他:
/**
* 根据key 获取缓存
* @return
*/
@RequestMapping("/get")
@ResponseBody
public String getredis(String key){
Object obj= redisService.get(key);
String red= JSON.toJSONString(obj);
return red;
}
运行效果:
删除缓存:根据key来删除缓存 删掉就没有了 效果就不演示了。
/**
* 根据key 删除缓存
* @return
*/
@RequestMapping("/del")
@ResponseBody
public String delredis(String key){
redisService.delete(key);
return "delete redis success";
}
这样做 当我们有些数据 不需要保存到数据库 但我们又需要使用它的时候
就可以用这种方法来操作数据
下面是list的方法:
/**
*保存list类型的缓存
* @return
*/
@RequestMapping("/lpush")
@ResponseBody
public Long lpushredis(){
Long size=redisService.lpush("abc","789");
return size;
}
/**
* 根据key 查询list类型的缓存
* @return
*/
@RequestMapping("/range")
@ResponseBody
public List<Object> rangeredis(){
List<Object> data= redisService.range("abc");
return data;
}
好了 有不懂的 联系 qq:185624592