REmote DIctionary Server(Redis) 是一个由Salvatore Sanfilippo写的key-value存储系统。
Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
它通常被称为数据结构服务器,因为值(value)可以是 字符串(String), 哈希(Hash), 列表(list), 集合(sets) 和 有序集合(sorted sets)等类型。
Redis 与其他 key - value 缓存产品有以下三个特点:
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 过期等等特性。
当系统需要对数据进行操作时,会调用SQL语句,让数据库服务器对数据进行操作。在小规模的系统中,调用SQL语句次数少频率低,数据库服务器不会有什么大的问题。但是随着系统的规模越来越大,数据操作越来越频繁,数据库执行SQL语句的速度就会大幅度下降,严重影响操作的进度,数据库服务器甚至不堪重负直接挂了。为了缓解数据库服务器的压力,在系统与服务器之间建立一个缓冲区是很好的选择。当需要大量操作数据时,先对缓冲区的数据进行操作,然后缓冲区将响应的操作进行处理,再让数据库服务器执行,这样就减少了数据库服务器的压力,而Redis就是起到这个缓冲区的作用。下面用图来简单对比一下,如有不当欢迎斧正:
正常情况下是这样子的:
Redis在分布式中尤其常用,这篇博文讲述得很好,戳我查阅
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
###########################redis#########################
#Redis服务器地址
spring.redis.host=127.0.0.1
#Redis服务器连接端口
spring.redis.port=6379
#Redis服务器连接密码(默认为空)
spring.redis.password=
#Redis数据库索引(默认为0)
spring.redis.database=0
#连接池最大连接数(使用负值表示没有限制)
spring.redis.jedis.pool.max-active=50
#连接池最大阻塞等待时间(使用负值表示没有限制)
spring.redis.jedis.pool.max-wait=3000
#连接池中的最大空闲连接
spring.redis.jedis.pool.max-idle=8
#连接池中的最小空闲连接
spring.redis.jedis.pool.min-idle=2
#连接超时时间(毫秒)
spring.redis.timeout=2000
User类
package com.eknaij.springredis.pojo;
public class User {
String occupation;
String name;
public String getOccupation() {
return occupation;
}
public void setOccupation(String occupation) {
this.occupation = occupation;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
package com.eknaij.springredis.config;
import com.eknaij.springredis.pojo.User;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public class Utils {
@Autowired
private RedisTemplate<String, String> redisTemplate;
Gson gson = new Gson();
/**添加操作,一下三个分别为1.添加普通的String 2.添加对象作为value 3.添加列表作为value**/
public void add(String key,String value){
redisTemplate.opsForValue().set(key, value);
}
public void add(String key,User user){
redisTemplate.opsForValue().set(key, gson.toJson(user));
}
public void addList(String key,List<User> userList){
redisTemplate.opsForValue().set(key, gson.toJson(userList));
}
/**根据key进行删除**/
public boolean deleteByKey(String key){
return redisTemplate.opsForValue().getOperations().delete(key);
}
/**查询返回的是一个对象**/
public User getByKey(String key){
Gson gson = new Gson();
User user = null;
String dataJson = redisTemplate.opsForValue().get(key);
if(dataJson != null){
user = gson.fromJson(dataJson, User.class);
}
return user;
}
/**查询返回的是一个列表**/
public List<User> getUserListByKey(String key){
List<User> userList = null;
String userJson = redisTemplate.opsForValue().get(key);
if(userJson != null){
userList = gson.fromJson(userJson, new TypeToken<List<User>>(){}.getType());
}
return userList;
}
}
package com.eknaij.springredis.service;
import com.eknaij.springredis.config.Utils;
import com.eknaij.springredis.pojo.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
@Service
public class UserService {
@Autowired
Utils redisUtils;
public void redisInitData(){
redisUtils.add("添加key","添加value");
//测试添加对象
User user =new User();
user.setOccupation("医生");
user.setName("小明");
redisUtils.add(user.getOccupation(),user);
//测试添加列表
List<User> ls = new ArrayList();
User user2 =new User();
user2.setOccupation("列表里的对象1");
user2.setName("列表里的对象11");
User user3=new User();
user3.setOccupation("列表里的对象2");
user3.setName("列表里的对象22");
ls.add(user2);
ls.add(user3);
redisUtils.addList("列表",ls);
}
public User getUserRedis(String key){
User user = redisUtils.getByKey(key);
return user;
}
public List<User> getUserList(String key){
List ls = redisUtils.getUserListByKey(key);
return ls;
}
public boolean deleteUserByKey(String key){
return redisUtils.deleteByKey(key);
}
}
package com.eknaij.springredis.controller;
import com.eknaij.springredis.pojo.User;
import com.eknaij.springredis.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@RestController
public class UserController {
@Autowired
UserService userService;
//模拟添加数据
@RequestMapping("/add")
public String addRedisData(){
userService.redisInitData();
return "success";
}
@RequestMapping("/getUserByKey")
public Map<String,Object> getUserRedisByKey(String key){
Map<String,Object> result = new HashMap<String, Object>();
User user = userService.getUserRedis(key);
result.put("occupation",user.getOccupation());
result.put("name", user.getName());
return result;
}
@RequestMapping("/getUserList")
public List getUserList(String key){
List ls = userService.getUserList(key);
return ls;
}
@RequestMapping("/deleteUserByKey")
public String deleteUserByKey(String key){
if(userService.deleteUserByKey(key))
return "删除成功";
return "删除失败";
}
}
浏览器输入http://localhost:8080/add
将数据添加到数据库中
简单整合了一下SpringBoot+Redis,整个过程比较简单,但是Redis的实际运用远远比这复杂得多,具体运用要根据具体的项目来决定。文中有不当的地方,欢迎大神斧正,共同学习共同进步。
相关源码下载地址,源码地址