## Redis是什么?
Redis是一个基于内存且支持持久化的key-value的NoSQL数据库,其中每个key和value都是使用对象表示的,具有以以下特征:多样数据类型、持久化、主从同步。
## 为什么使用?
1、解决应用服务器的cpu和内存压力。 2、减少io的读操作,减轻io的压力。
## 优点
1、nosql数据库没有关联关系,数据结构简单,拓展表比较容易。2、nosql读取速度快,对较大数据处理快
## 适用场景
数据高并发的读写,
海量数据的读写,
对扩展性要求高的数据
## 怎么使用?
**pom.xml**
<!--引入Redis依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
**application.yml**
spring:
redis:
# Redis数据库索引(默认为0)
# database: 0
# Redis服务器地址
host: 192.168.1.12
# Redis服务器连接端口
port: 6379
# Redis服务器连接密码
password: redispwd@$&*!#&*)&$>...
# 连接超时时间(毫秒)
#timeout: 1000
jedis:
pool:
# 连接池最大连接数(使用负值表示没有限制)
max-active: 8
# 连接池中的最大空闲连接
max-idle: 500
# 连接池中的最小空闲连接
min-idle: 0
# 连接池最大阻塞等待时间(使用负值表示没有限制)
max-wait: -1
**RedisTemplate模板类(源码)在操作redis时默认使用JdkSerializationRedisSerializer来进行序列化。因此,会出现中文乱码。**
**解决办法:对源码进行改造,封装RedisConfigurtion,重写RedisTemplate**
/**
* RedisTemplate配置
* @param factory
* @return
*/
@Bean
public RedisTemplate redisTemplate(RedisConnectionFactory factory) {
StringRedisTemplate template = new StringRedisTemplate(factory);
//定义key序列化方式
//RedisSerializer<String> redisSerializer = new StringRedisSerializer();//Long类型会出现异常信息;需要我们上面的自定义key生成策略,一般没必要
//定义value的序列化方式
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(om);
template.setValueSerializer(jackson2JsonRedisSerializer);
template.setHashValueSerializer(jackson2JsonRedisSerializer);
template.afterPropertiesSet();
return template;
}
**Redis存储数据**
@Autowired
private RedisConfigurtion redisConfigurtion;
@RequestMapping("/net")
public String index(HttpServletRequest request, ModelMap model) {
RedisTemplate redisTemplate = redisConfigurtion.redisTemplate(null);
String key = JalorUtils.getKey();
RedisHandler handler = new RedisHandler();
handler.setHandid(key);
handler.setCreatetime(JalorUtils.systemdate());
handler.setHandle("网站正在被访问!");
redisTemplate.opsForValue().set(key, handler);
log.info("进入网站: "+ redisTemplate.opsForValue().get(key));
return "/net/index.html";
}
**获取Redis库中的数据**
创建 ReadisKVController.java
package com.syjalor.blog.web.controller.redis;
import com.syjalor.blog.modules.redis.RedisConfigurtion;
import com.syjalor.blog.modules.redis.RedisHandler;
import lombok.extern.slf4j.Slf4j;
import org.apache.jasper.tagplugins.jstl.core.ForEach;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Controller;
import java.util.*;
@Slf4j
@Controller
public class ReadisKVController {
@Autowired
private RedisConfigurtion redisConfigurtion;
/**
* 获取Redis库中的数据
* @return
*/
public List<RedisHandler> getRedis(){
// 创建LIST集合
List<RedisHandler> list = new ArrayList<>();
// redis格式化工具
RedisTemplate redisTemplate = redisConfigurtion.redisTemplate(null);
// 获取所有的key
Set<String> keys = redisTemplate.keys("*");
// 不用 foreach循环 的原因是,数据是太大时,速度会下降的很明显
// for (String key : keys) {
Iterator<String> it = keys.iterator();
while (it.hasNext()) {
String key = it.next();
// 获取key对应的value
String value = String.valueOf(redisTemplate.opsForValue().get(key));
/* 截取的第一个字符的位置 */
String strStart = "(";
/* 找出指定的2个字符在 该字符串里面的 位置 */
int strStartIndex = value.indexOf(strStart);
int strEndIndex = value.indexOf(")");
/* 开始截取 */
String result = value.substring(strStartIndex, strEndIndex).substring(strStart.length());
// 实例化对象
RedisHandler redisHandler = new RedisHandler();
//分割后存入数组
String[] strArr = result.split(",");
for (String str : strArr) {
int index = str.indexOf("=");
String k = str.substring(0, index);
String v = str.substring(index + 1, str.length());
if (k.contains("did")) {
redisHandler.setHandid(v);
} else if (k.contains("time")) {
redisHandler.setCreatetime(v);
} else if (k.contains("handle")) {
redisHandler.setHandle(v);
} else if (k.contains("type")) {
redisHandler.setType(Integer.parseInt(v));
}
}
list.add(redisHandler);
}
return list;
}
}
***在此,笔者不建议各位使用该方法存储,对照数据一看便知其原因***
`````
处理前
RedisHandler(id=null, handid=20190811120454996077490634776, createtime=2019-08-11 12:04:54, handle=博客网正在被访问!, type=0)
处理后
id=null, handid=201908300531152614058277091328, createtime=2019-08-30 05:31:15, handle=博客网正在被访问!, type=0
可再处理...
`````
**结束语**
`````
以上是Redis的入门知识。笔者本还想谈谈Redis在springboot、springmvc、动态JAVA项目中各自的配置和使用,除了配置和序列化工具的使用有所差异,其原理是相通的。这里就不提供详细的代码了,有兴趣的可以研究一下。
说到这里,笔者不得不提一嘴 Redis 哈希(Hash) ,也是笔者强烈推荐使用的一种数据类型,如果有机会,我会专写一篇 Redis 哈希(Hash)。
`````