redis分页
在一个项目中,有访问比较频繁的情况出现,这个时候,如果利用数据库进行处理,效率就会比较慢,这个时候,使用了redis这种NoSql数据库,由于项目的原因,我做了一个demo,用于展示。
我使用的是springboot+mybatis的框架,搭建的过程看我的另一篇博客,在这里附上pom.xml的文件,利用maven进行管理jar包,这里只是部分,要是想看全的,看我的另一篇博客。
<!--在建立springboot项目的时候选择的redis-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!--设置reids配置需要的依赖包-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<!--使用的是jedis这个类-->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>
这个是文件的目录结构
将redis的一些需要的jar包引入进去之后,我们要封装一个redisutils这个类,用于一些redis的一些基本操作,包括了一些注释。
package cn.aimacademy.spy.spyserver.server.redisservice;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
import java.util.Set;
@Service
public class RedisUtilsService {
@Autowired
StringRedisTemplate stringRedisTemplate;
@Resource(name = "stringRedisTemplate")
ValueOperations<String, String> valOpsStr;
@Autowired
RedisTemplate<Object, Object> redisTemplate;
@Resource(name = "redisTemplate")
ValueOperations<Object, Object> valOpsObj;
/**
* 根据指定key获取String
*
* @param key
* @return
*/
public String getStr(String key) {
String s = valOpsStr.get(key);
if (s == null) {
return "暂无对应的值";
} else {
return s;
}
}
/**
* 设置Str缓存
*
* @param key
* @param val
*/
public void setStr(String key, String val) {
valOpsStr.set(key, val);
}
/**
* 删除指定key
*
* @param key
*/
public void del(String key) {
stringRedisTemplate.delete(key);
}
/**
* 根据指定o获取Object
*
* @param o
* @return
*/
public Object getObj(Object o) {
Object o1 = valOpsObj.get(o);
if (o1 == null) {
return o1;
} else {
return o1;
}
}
/**
* 设置obj缓存
*
* @param key
* @param value
*/
public void setObj(Object key, Object value) {
valOpsObj.set(key, value);
}
/**
* 删除Obj缓存
*
* @param o
*/
public void delObj(Object o) {
redisTemplate.delete(o);
}
/**
* 添加对象到redis 里面的list中
* redis中的 list 是双向的 所以添加的时候需要注意
* rightPush 先进先出 leftPush 先进后出 这里 需要注意
*
* @param key list 对应的key
* @param obj 需要存的对象
*/
public void addList(String key, Object obj) {
redisTemplate.opsForList().rightPush(key, obj);
}
/**
* opsForList().range(key, start, end); 取范围值 redis里面的list下标从0开始
* 流程 拿到key 对应的list 取 0 到 5 和 mysql的limt 类似 注意下标即可
* 从redis list 里面的获取数据分页
*
* @param key redis list 对应的key
* @param start 开始下标
* @param end 介绍下标
* @return 返回list给前端
*/
public List getListPage(String key, int start, int end) {
return (List) redisTemplate.opsForList().range(key, start, end);
}
/**
* 新增一个有序集合,存在为false,不存在是true
* @param k,集合名字,
* @param v k值
* @param score 分数
* @return
*/
public boolean addZSet(Object k ,String v,double score){
return redisTemplate.opsForZSet().add(k,v,score);
}
public Set getZSetByName(Object key, int start, int end) {
return redisTemplate.opsForZSet().reverseRangeWithScores(key, start, end);
}
public long getZSetSize(Object k){
return redisTemplate.opsForZSet().size(k);
}
}
写好之后,还需要建立一个redis的config文件,用于配置redis的一些初始化。
package cn.aimacademy.spy.spyserver.config;
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
@Configuration
@EnableCaching
public class RedisConfig extends CachingConfigurerSupport {
//缓存管理器 spring boot 2.0后 配置缓存管理器 和2.0以前 不一样 根据自己的版本 配置
@Bean
public RedisCacheManager cacheManager(RedisConnectionFactory redisTemplate) {
return RedisCacheManager.create(redisTemplate);
}
// 以下两种redisTemplate自由根据场景选择
@Bean
public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
RedisTemplate<Object, Object> template = new RedisTemplate<>();
template.setConnectionFactory(connectionFactory);
//使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值(默认使用JDK的序列化方式)
Jackson2JsonRedisSerializer serializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper mapper = new ObjectMapper();
mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
serializer.setObjectMapper(mapper);
template.setValueSerializer(serializer);
//使用StringRedisSerializer来序列化和反序列化redis的key值
template.setKeySerializer(new StringRedisSerializer());
template.afterPropertiesSet();
//这里设置redis事务一致
template.setEnableTransactionSupport(true);
return template;
}
@Bean
public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory factory) {
StringRedisTemplate stringRedisTemplate = new StringRedisTemplate();
stringRedisTemplate.setConnectionFactory(factory);
stringRedisTemplate.setEnableTransactionSupport(true);
return stringRedisTemplate;
}
}
到这基本也就写完了,这个时候就有人问我,你也没说分页啊,在redis里面,有一个zSet的数据结构,里面可以进行排序操作,redis里面总共有五种数据结构,String,List,Hash,Set,zSet,前面的大家基本都知道了,字符串,集合,哈希,无序集合,有序集合,其实也可以利用List进行分页操作,但是写法和效率都比较慢,所以还是直接使用zSet这个里面的东西了,在刚才那个RedisUtilsServer的类里面最后两个方法封装了zSet的一些方法,其实zSet还有很多的方法,这个时候就是看自己慢慢学了,在这里就不介绍了。
下面是在redis里面进行赋值的操作,其中,第一个属性,是在redis里面标记是那个list的名字,第二个是具体的数据,第三个是排序用的。
List<Map<String, Object>> list = textServer.queryInfo();
for (Map<String, Object> map : list) {
//这里循环user 把每个对象存到 redis中list中
// redisUtilsService.addList("list",map);
String creation_date = map.get("creation_date") == null ? "2000-01-01 00:00:00" : map.get("creation_date").toString();
String creationDate = DateUtils.date2TimeStamp(creation_date, "yyyy-MM-dd HH:mm:ss");
redisUtilsService.addZSet(CommonUtils.ENT_INFO_LIST, map.toString(), Double.parseDouble(creationDate));
}
同样取值的时候,这么取值就可以了。
Set list = redisUtilsService.getZSetByName(CommonUtils.ENT_INFO_LIST,0,5);
下面这个就是CommonUtils
public class CommonUtils {
public final static String ENT_INFO_LIST = "ENT_INFO_LIST";
}
我已经把大部分的代码粘贴出来了,要是有不懂的,或者是有疑问的,可以联系我,qq:1029273212
版权声明:本文为qq_34237136原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。