1,首先先从网上下载redis安装包
2,然后使用FileZilla将压缩包上传至linux中
3,再用putty连接linux ,设置window为Change the size of the fort (可以复制粘贴)
设置Connection的时间(这样就算一段时间不使用putty也不会关闭)
4, cd到你安装redis的目录执行解压命令
tar -zxvf redis-4.0.11.tar.gz ,这时会多一个文件,cd进去进行编译,看到
Hint: It.....说明编译成功了
5,接下来要进行安装 PREFIX后面是你指定的安装目录(一般都在usr目录下)
make install PREFIX=/usr/local/redis ,看到下面的♂说明安装完成了,
6,把把/root/redis-4.0.11/redis.conf复制到/usr/local/redis/bin目录下
cp redis.conf /usr/local/redis/bin/
再cd到/usr/local/redis/bin下会看到这样的目录结构
7,接下来就对redis进行配置,vim redis.conf ,将bind注释到,requirepass是设置密码的
daemonize是是否允许远程登陆的
8,开启redis ./redis-server redis.conf, 再输入ps aux|grep redis查看redis的进程到到下图说明成功开启了。
9,关闭操作有两种一种kill -9 还有一种如下图 如何没有设置密码直接./redis-cli
然后shutdown,设置密码的话需要在输入auth 你的密码。(输入quit退出)
到这里redis的安装与配置就已经全部完成了,接下来,就是项目运用了。
项目我分为2个项目,一个是ssm项目,另一个是springboot项目。
1,准备工作,
(1)安装redis客户端RedisDesktopManager(这个在网上有很多,这里就不多说了,有不会的可以私信我)
(2)连接redis
2,编辑applicationContext-redis.xml文件
xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.2.xsdhttp://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.2.xsd">
3,添加依赖jedis是redis的组件,jackson是用来处理数据的。
redis.clients
jedis
2.9.0
com.fasterxml.jackson.core
jackson-databind
2.8.3
4,引一个jsonUtil工具类,和一个jedisClient的接口,以及其实现类
package com.sesame.utils;
import java.util.List;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.ObjectMapper;
/**
*
*/
public class JsonUtils {
// 定义jackson对象
private static final ObjectMapper MAPPER = new ObjectMapper();
/**
* 将对象转换成json字符串。
*
Title: pojoToJson
*
Description:
* @param data
* @return
*/
public static String objectToJson(Object data) {
try {
String string = MAPPER.writeValueAsString(data);
return string;
} catch (JsonProcessingException e) {
e.printStackTrace();
}
return null;
}
/**
* 将json结果集转化为对象
*
* @param jsonData json数据
* @param clazz 对象中的object类型
* @return
*/
public static T jsonToPojo(String jsonData, Class beanType) {
try {
T t = MAPPER.readValue(jsonData, beanType);
return t;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 将json数据转换成pojo对象list
*
Title: jsonToList
*
Description:
* @param jsonData
* @param beanType
* @return
*/
public static List jsonToList(String jsonData, Class beanType) {
JavaType javaType = MAPPER.getTypeFactory().constructParametricType(List.class, beanType);
try {
List list = MAPPER.readValue(jsonData, javaType);
return list;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
package com.sesame.redis;
public interface JedisClient {
String set(String key, String value);
String get(String key);
Boolean exists(String key);
Long expire(String key, int seconds);
Long ttl(String key);
Long incr(String key);
Long hset(String key, String field, String value);
String hget(String key, String field);
Long hdel(String key,String... field);//删除hkey
}
package com.sesame.redis;
import org.springframework.beans.factory.annotation.Autowired;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
public class JedisClientPool implements JedisClient {
@Autowired
private JedisPool jedisPool;
@Override
public String set(String key, String value) {
Jedis jedis = jedisPool.getResource();
String result = jedis.set(key, value);
jedis.close();
return result;
}
@Override
public String get(String key) {
Jedis jedis = jedisPool.getResource();
String result = jedis.get(key);
jedis.close();
return result;
}
@Override
public Boolean exists(String key) {
Jedis jedis = jedisPool.getResource();
Boolean result = jedis.exists(key);
jedis.close();
return result;
}
@Override
public Long expire(String key, int seconds) {
Jedis jedis = jedisPool.getResource();
Long result = jedis.expire(key, seconds);
jedis.close();
return result;
}
@Override
public Long ttl(String key) {
Jedis jedis = jedisPool.getResource();
Long result = jedis.ttl(key);
jedis.close();
return result;
}
@Override
public Long incr(String key) {
Jedis jedis = jedisPool.getResource();
Long result = jedis.incr(key);
jedis.close();
return result;
}
@Override
public Long hset(String key, String field, String value) {
Jedis jedis = jedisPool.getResource();
Long result = jedis.hset(key, field, value);
jedis.close();
return result;
}
@Override
public String hget(String key, String field) {
Jedis jedis = jedisPool.getResource();
String result = jedis.hget(key, field);
jedis.close();
return result;
}
@Override
public Long hdel(String key, String... field) {
Jedis jedis = jedisPool.getResource();
Long hdel = jedis.hdel(key, field);
jedis.close();
return hdel;
}
}
5,接下来就可以编写代码了,定义一个Student的表
CREATE TABLE `student` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT ' 主键 ',
`name` varchar(50) DEFAULT NULL COMMENT ' 名字 ',
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='学生表'
6,同样需要在项目中定义一个Student的POJO
package com.sesame.wx.liyuan.bean;
import java.io.Serializable;
public class Student implements Serializable{
private static final long serialVersionUID = 1L;
private Integer id;
private String name;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
7,Dao层
public Student getStudent(Integer stuId);
select id, name from student where id = #{stuId}
8,Service层
public Student getStudent(Integer stuId) {
try {
String jsonstr = client.get("CONTENT_KEY"+stuId);//从redis数据库中获取内容分类下的所有的内容。
//如果存在,说明有缓存
if(StringUtil.isNotEmpty(jsonstr)){
System.out.println("这里有缓存啦!!!!!");
return JsonUtils.jsonToPojo(jsonstr, Student.class); //将json数据转为POJO对象
}
} catch (Exception e1) {
e1.printStackTrace();
}
Student student = liyuanDao.getStudent(stuId);
try {
System.out.println("没有缓存!!!!!!");
client.set("CONTENT_KEY"+stuId, JsonUtils.objectToJson(student)); // 将数据转为json数据传入redis数据库
client.expire("CONTENT_KEY"+stuId, 100); // 设置缓存时间,单位为秒
} catch (Exception e) {
e.printStackTrace();
}
return student;
}
9,Controller层
@RequestMapping("/getStudent")
@ResponseBody
public Map getStudent(Integer stuId) {
Map resMap = new HashMap();
Student student = liyuanSercice.getStudent(stuId);
resMap.put("student", student);
return resMap;
}
当看到下面的图片,说明缓存成功了。TTL是你设置的缓存时间
上面就是ssm使用redis的全部过程了,接下来就介绍springboot项目使用redis,这里还使用了cache插件来整合redis看起来代码更简洁一点。
1,首先创建user表,(我们不在是学生了,变成用户了=-=)
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT ' 主键 ',
`name` varchar(50) DEFAULT NULL COMMENT ' 名字 ',
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='用户表'
2,配置文件
yml
spring:
redis:
host: 192.168.92.128
port: 6379
password: 123456
cache:
type: redis
cache:
expire-time: 180 // 设置过期时间
CONFIG
package com.walklake.log.config;
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cache.interceptor.KeyGenerator;
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;
/**
* 必须继承CachingConfigurerSupport,不然此类中生成的Bean不会生效(没有替换掉默认生成的,只是一个普通的bean)
* springboot默认生成的缓存管理器和redisTemplate支持的类型很有限,根本不满足我们的需求,会抛出如下异常:
* org.springframework.cache.interceptor.SimpleKey cannot be cast to java.lang.String
*/
@Configuration
@EnableCaching
public class SpringCacheRedisConfig extends CachingConfigurerSupport {
@Value("${cache.expire-time:180}")
private int expireTime;
// 配置key生成器,作用于缓存管理器管理的所有缓存
// 如果缓存注解(@Cacheable、@CacheEvict等)中指定key属性,那么会覆盖此key生成器
@Bean
public KeyGenerator keyGenerator() {
return (target, method, params) -> {
StringBuilder sb = new StringBuilder();
sb.append(target.getClass().getName());
sb.append(method.getName());
for (Object obj : params) {
sb.append(obj.toString());
}
return sb.toString();
};
}
// 缓存管理器管理的缓存都需要有对应的缓存空间,否则抛异常:No cache could be resolved for 'Builder...
@Bean
public CacheManager cacheManager(RedisTemplate redisTemplate) {
RedisCacheManager rcm = new RedisCacheManager(redisTemplate);
rcm.setDefaultExpiration(expireTime); //设置缓存管理器管理的缓存的过期时间, 单位:秒
return rcm;
}
@Bean
public RedisTemplate redisTemplate(RedisConnectionFactory factory) {
StringRedisTemplate template = new StringRedisTemplate(factory);
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.afterPropertiesSet();
return template;
}
}
3,接下来就是项目了,先在pom文件添加依赖
org.springframework.boot
spring-boot-starter-data-redis
org.springframework.boot
spring-boot-starter-cache
4,创建POJO
package com.walklake.log.entity;
import java.io.Serializable;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import lombok.Data;
@Data
@Entity
@Table(name="user")
public class User implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
private String name;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
5,Dao层(这里springboot使用的是spring data,非常好用,有时间我写一个spring data的文章)
package com.walklake.log.dao;
import org.springframework.data.repository.CrudRepository;
import com.walklake.log.entity.User;
public interface UserDAO extends CrudRepository {
User findById(Integer id);
}
6,Service(cache插件 @Cacheable为查询,第一次走代码,第二次走redis,@CachePut为更新,每次都会走代码,并将返回值保存到redis数据库中,所以一定要有返回值,
不然会保存null,@CacheEvict为删除,@Caching为组合可以任意搭配前面的注解
package com.walklake.log.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.cache.annotation.Caching;
import org.springframework.stereotype.Service;
import com.walklake.log.dao.UserDAO;
import com.walklake.log.entity.User;
@Service
public class UserService {
public static final String CACHE_KEY = "myCache";
@Autowired
private UserDAO userDAO;
public void saveUser(String name) {
User user = new User();
user.setName(name);
userDAO.save(user);
}
@CacheEvict(value="user",key ="'myCache'+#id")
public void deleteUser(Integer id) {
userDAO.delete(id);
}
@CachePut(value = "user",key ="'myCache'+#user.getId()")
public User updateUser(User user) {
return userDAO.save(user);
}
@Cacheable(value="user",key ="'myCache'+#id")
public User searchUser(Integer id) {
return userDAO.findById(id);
}
@Caching(cacheable = {@Cacheable(value="user",key ="'myCache'+#id")},
put = {@CachePut(value = "user",key ="'myCache'+#user.getId()")},
evict = {@CacheEvict(value="user",key ="'myCache'+#id")}
)
public User updateAndSelect(User user) {
userDAO.delete(user.getId());
return userDAO.save(user);
}
}
7,Controller层
package com.walklake.log.controller;
import java.util.HashMap;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.walklake.log.entity.User;
import com.walklake.log.service.UserService;
/*
* @Author:zjd
* @Date:2019/5/13 15:29
* @Detail:记录签到数据
*/
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/save")
@SuppressWarnings("rawtypes")
public Map save(String name) {
Map resMap = new HashMap();
try {
userService.saveUser(name);
resMap.put("result", "保存成功");
} catch (Exception e) {
e.printStackTrace();
resMap.put("result", "保存失败");
}
return resMap;
}
@GetMapping("/delete")
@SuppressWarnings("rawtypes")
public Map delete(Integer id) {
Map resMap = new HashMap();
try {
userService.deleteUser(id);
resMap.put("result", "删除成功");
} catch (Exception e) {
e.printStackTrace();
resMap.put("result", "删除失败");
}
return resMap;
}
@GetMapping("/update")
@SuppressWarnings("rawtypes")
public Map update(Integer id, String name) {
Map resMap = new HashMap();
User user = new User();
user.setId(id);
user.setName(name);
try {
userService.updateUser(user);
resMap.put("result", "更新成功");
} catch (Exception e) {
e.printStackTrace();
resMap.put("result", "更新失败");
}
return resMap;
}
@GetMapping("/search")
@SuppressWarnings("rawtypes")
public Map search(Integer id) {
Map resMap = new HashMap();
try {
User user = userService.searchUser(id);
resMap.put("result", user);
} catch (Exception e) {
e.printStackTrace();
resMap.put("result", "查询失败");
}
return resMap;
}
@GetMapping("/updateAndSelect")
@SuppressWarnings("rawtypes")
public Map updateAndSelect(Integer id, String name) {
Map resMap = new HashMap();
User user = new User();
user.setId(id);
user.setName(name);
try {
userService.updateUser(user);
resMap.put("result", "更新成功");
} catch (Exception e) {
e.printStackTrace();
resMap.put("result", "更新失败");
}
return resMap;
}
}
8,接下来就进行测试了
(1)首先测试查询,看到下面的图片说明成功了
(2)然后测试更新,看到下面的图片说明成功了
(3)测试删除,看到下面的图片说明成功了
(4)最后测试组合组件,看到下面的图片说明成功了
全部搞定!!!