概念理解
官网:https://redis.io
中文网:http://www.redis.net.cn
- redis.windows.conf:配置文件
- redis-cli.exe:redis客户端
- redis-server.exe:redis服务器端
redis是一款高性能的NOSQL系列的非关系型数据库。not only sql 不仅仅是sql。具体的概念百度很多。开源的,c语言开发的,键值对数据库(key-value)有着极高的并发读写性能。·
我的理解
目前我理解到的就是提高用户的体验度,可以将一些数据首次访问时,从数据库中获取,同时用Jedis将数据存储到redis中,这样,查询从缓存中查询数据的速度比从数据库中查询数据的速度要快很多。redis有两种持久化的方式,默认方式的性能优于第二种(下文f详解)。
存储数据类型
目前redis支持五种键值对。命令均为常用,其它另行百度
字符串类型 string :set key value ;get key ;del key。
哈希 hash :hset key field value;hget key field;hgetall key;hdel key field
列表 list:l®push key value;lrange key 0 -1;l®pop key。
集合 set :sadd key value;smembers key;srem key value。
有序集合 sortedset :zadd key score value;
zrange key start end [withscores];zrem key value。
通用命令
keys *获取所有的键;type keyname 获取value类型;del keyname 删除指定的key。
reids持久化方式
RDB
在redis.windows.conf文件中有这样的一段代码(默认持久化,最好不要随意修改)
解释(在一下条件中,有一个满足了,就会持久化到dump.rdb文件中)
AOF
并不太建议使用,消耗性能。
日志记录的方式,可以记录每一条命令的操作。可以每一次命令操作后,持久化数据
编辑redis.windwos.conf文件
appendonly no(关闭aof) --> appendonly yes (开启aof)
#appendfsync always : 每一次操作都进行持久化
appendfsync everysec : 每隔一秒进行一次持久化
#appendfsync no : 不进行持久化
持久化到硬盘的文件
(写在前面,之前在考了朋友的redis,keys * 一直有数据,等待默认时间,也不会修改,每次启动都有,由于自己对redis持久化理解不透彻,所以直接找到.rdb文件删除,从而使redis不在读取此文件)
默认rdb文件存放路径是当前目录,文件名是:dump.rdb。可以在配置文件中修改路径和文件名,分别是dir和dbfilename
在配置文件中,可以修改持久化文件的文件名和存储路径。
jedis工具类
原代码
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
import java.util.Properties;
/**
* 提供一个Redis连接
*/
public class JedisUtils {
private static JedisPool jedisPool;
private JedisUtils(){}
static{
try{
/*将配置文件中的数据读取到集合中*/
Properties properties = new Properties();
properties.load(JedisUtils.class.getClassLoader().getResourceAsStream("jedis.properties"));
String host = properties.getProperty("host");
String port = properties.getProperty("port");
String maxTotal = properties.getProperty("maxTotal");
String maxIdle = properties.getProperty("maxIdle");
/*根据配置文件信息初始化连接池*/
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxIdle(Integer.parseInt(maxIdle));
config.setMaxTotal(Integer.parseInt(maxTotal));
jedisPool = new JedisPool(config,host,Integer.parseInt(port));
}catch (Exception e){
e.printStackTrace();
}
}
public static Jedis getJedis(){
return jedisPool.getResource();
}
public static void main(String[] args) {
System.out.println(getJedis());
}
}
当redis服务器没有启动时,代码处理方式
import java.util.List;
public class CategoryServiceImpl implements ICategoryService {
private CategoryDaoImpl categoryDao = new CategoryDaoImpl();
@Override
public List<Category> findAll() throws Exception {
Jedis jedis = null;
String category = null;
List<Category> list = null;
try {
jedis = JedisUtils.getJedis();
category = jedis.get("category");
jedis.close();
} catch (Exception e) {
e.printStackTrace();
}
if (category == null) {
list = categoryDao.findAll();
System.out.println("正在从数据库查询数据... ...");
if (jedis != null) {
jedis.set("category", new ObjectMapper().writeValueAsString(list));
}
} else {
list = new ObjectMapper().readValue(category, List.class);
System.out.println("正在从缓存中查询数据.. ..");
}
return list;
}
}
先将jedis放到成员变量中,再try…catch…如果没有启动直接讲错误发送到控制台。从数据库获取数据后还要将数据存入redis中,所以的三个红框的作用,还是再次通过判断jedis是否不为空(有地址值),来确定redis服务器是否正常启动。
第一个篮框:将指定数据类型转换为json数据存入到reids中。
第二个篮框:将redis中json数据读取成指定数据类型。