简介
Redis是一种NoSQL数据库,即非关系型数据库。redis是一个key-value存储系统。它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
特点
Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
Redis支持数据的备份,即master-slave模式的数据备份。
优势
性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。
丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
原子 – Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。
丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。
搭建一个简单的Demo ,方便理解:
项目结构:
pom文件依赖如下:
<!--redis-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
<version> 2.6.1</version>
</dependency>
application.yml文件配置如下:
server:
port: 8888
spring:
application:
name: cloud-redis-demo
redis:
database: 0
host: 127.0.0.1
password:
port: 6379
timeout: 5000
pool:
max-active: 100
max-wait: -1
min-idle: 0
max-idle: 8
我们采用的是RedisTemplate来操作redis,所以要配置相关的配置:
@Configuration
@EnableCaching
public class RedisConfig extends CachingConfigurerSupport {
public RedisConfig() {
System.out.println("RedisConfig容器启动初始化。。。");
}
@Resource
private LettuceConnectionFactory lettuceConnectionFactory;
@Bean
public RedisTemplate<String, Serializable> redisTemplate(
LettuceConnectionFactory redisConnectionFactory)
throws UnknownHostException{
RedisTemplate<String,Serializable> template = new RedisTemplate<String,Serializable>();
/*通过在这里设置redis存储数据采取的序列化格式*/
template.setKeySerializer(new StringRedisSerializer());
// template.setValueSerializer(new GenericJackson2JsonRedisSerializer());
//
// template.setHashKeySerializer(new StringRedisSerializer());// Hash key序列化
//
// template.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());// Hash value序列化
template.setConnectionFactory(redisConnectionFactory);
return template;
}
}
编写一个工具类,来操作redis:
@Component
public class RedisUtils {
@Autowired
private RedisTemplate<String, Serializable> redisCacheTemplate;
/**
* 判断缓存中是否有对应的value
*
* @param key
* @return
*/
public boolean exists(final String key) {
return redisCacheTemplate.hasKey(key);
}
/**
* 读取缓存
*
* @param key
* @return
*/
public Object get( String key) {
Object result = null;
result = redisCacheTemplate.opsForValue().get(key);
return result;
}
/**
* 写入缓存
*
* @param key
* @param value
* @return
*/
public boolean set(String key, String value) {
boolean result = false;
try {
redisCacheTemplate.opsForValue().set(key,value);
result = true;
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
}
写一个控制器来测试:
@RestController
public class RedisControl {
@Autowired
private RedisUtils redisUtils;
@RequestMapping(value = "/setValue",method = RequestMethod.GET)
public String setValue(){
String key = "Hi";
String value = "World";
try{
redisUtils.set(key,value);
}catch (Exception e){
e.printStackTrace();
return "FAIL";
}
return "SUCCESS";
}
@RequestMapping(value = "/getValue",method = RequestMethod.GET)
public String getValue(){
String key = "Hi";
return (String)redisUtils.get(key);
}
}
注:这里需要注意一个问题,是我犯得的一个低级错误,在工具类RedisUtils编写完成之后,注入到sping容器中,在控制器引用的时候,采用原有java编程思想:private RedisUtils redisUtils = new RedisUtils();来调用这个工具类,并没有像上面那样采用注解@Autowired来自动从spring容器中引用这个工具类,导致项目运行之后,访问接口就会报空指针,原因是RedisTemplate这个为Null。
启动项目,先后访问http://localhost:8888/setValue、http://localhost:8888/setValue
。能够返回想要的结果就代表成功了。
这是一个最基本、最简单的一个Demo,从基本的设值、取值去实现,更详细、更复杂的功能还请查看大神们的文章。