1、概念:是高性能的nosql系列,非关系型数据库
2、关系型数据库:表和表之间有关系,并且数据以文件的形式存储在硬盘上
3、非关系型数据库:数据和数据之间没有关系,并且数据存储在内存中
4、重要文件
1)redis.windows.conf 配置文件
2)redis-cli.exe redis的客户端
3)redis-server.exe redis的服务器端
先启动服务器端,在启动客户端
5、redsi的数据结构
redis存储的是key,value格式的数据,其中key都是字符串,value有五种不同的数据结构
1)字符串类型

2)哈希类型:map格式

3)列表类型:linkedlist格式,允许重复,rpush-将元素加到列表尾部,lpush-将元素加到列表头部,lrange-按照范围获取元素、lpop-删除列表最左边的元素并返回该元素,rpop-删除列表最右边的元素并返回该元素

4)集合类型:set格式,不保证顺序

5)有序集合类型:sortedset格式,不允许重复,每一个元素关联一个double的分数,redis通过该分数,对元素进行排序

6、通用命令

7、持久化
1)redis是内存数据库,当redis服务器重启,或者电脑重启后,数据会丢失,可以将redis内存中的数据持久化保存到硬盘的文件中,redis重启时会自动加载这这文件,保证数据不丢失
2)RDB:默认的持久化方式:在一定的间隔时间中检测key的变化情况,然后持久化数据,但是不能保证所有数据都不丢失
save 900 1:超过900s,至少有1个可以发生改变,则持久化一次
save 300 10:超过300s,至少有10个key发生改变,则持久化一次
save 60 10000:超过六十秒,有最少10000个key发生变化,则做一次持久化,存入dump.rdb文件中
3)AOF:日志记录的方式:可以记录每一条命令,每一次命令操作后去持久化数据,对性能影响较大
appendonly no,关闭AOF
appendonly yes,打开AOF
持久化时会生成一个.aof的文件
8、jedis使用
java
package org.jedis;
import org.testng.annotations.Test;
import redis.clients.jedis.Jedis;
public class jedistest {
@Test
public void test1(){
//获取连接
Jedis jedis = new Jedis("localhost",6379);
//操作
jedis.set("name","hmy");
//释放资源
jedis.close();
}
}
9、不同数据结构的jedis操作
java
package org.jedis;
import org.testng.annotations.Test;
import redis.clients.jedis.Jedis;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class jedistest {
@Test
public void test1(){
//获取连接
Jedis jedis = new Jedis("localhost",6379);
//操作
jedis.set("name","hmy");
//释放资源
jedis.close();
}
@Test
public void test2(){
//获取连接,如果使用空参数,那么默认就是localhost和6379
Jedis jedis = new Jedis("localhost",6379);
//将键值对my-kkk存入redis,并且20s后自动删除
jedis.setex("my",20,"kkk");
//释放资源
jedis.close();
}
@Test
public void test3(){
//获取连接,如果使用空参数,那么默认就是localhost和6379
Jedis jedis = new Jedis("localhost",6379);
//存储hash
jedis.hset("hashmap","name","hhh");
jedis.hset("hashmap","age","13");
jedis.hset("hashmap","gender","man");
String age = jedis.hget("hashmap","age");
System.out.println(age);
Map<String,String> map = jedis.hgetAll("hashmap");
Set<String> keys = map.keySet();
for(String key : keys){
System.out.println("key: "+key+"value: "+map.get(key));
}
//释放资源
jedis.close();
}
@Test
public void test4(){
//获取连接,如果使用空参数,那么默认就是localhost和6379
Jedis jedis = new Jedis("localhost",6379);
//list存储
jedis.lpush("listaa","a","b","c");
jedis.rpush("listaa","a","b","c");
//list的范围获取
List<String> list = jedis.lrange("listaa",0,-1);
System.out.println(list);
//弹出
String str1 = jedis.lpop("listaa");
String str2 = jedis.rpop("listaa");
System.out.println(str1);
System.out.println(str2);
System.out.println(list);
//释放资源
jedis.close();
}
@Test
public void test5(){
//获取连接,如果使用空参数,那么默认就是localhost和6379
Jedis jedis = new Jedis("localhost",6379);
//set存储
jedis.sadd("setaa","java","php","cpp");
Set<String> set = jedis.smembers("setaa");
System.out.println(set);
//释放资源
jedis.close();
}
@Test
public void test6(){
//获取连接,如果使用空参数,那么默认就是localhost和6379
Jedis jedis = new Jedis("localhost",6379);
//sortedset
jedis.zadd("sorted",50,"aaaa");
jedis.zadd("sorted",40,"bbbb");
jedis.zadd("sorted",80,"cccc");
jedis.zrange("sorted",0,-1);
//释放资源
jedis.close();
}
}
8、jedis的连接池
java
@Test
public void test7(){
//创建一个配置对象
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxTotal(50);//最大连接数
config.setMaxIdle(10);//最大空闲连接数
//获取连接池对象
JedisPool jedisPool = new JedisPool(config);
//获取连接
Jedis jedis = jedisPool.getResource();
jedis.set("namea","hhjjj");
jedis.get("namea");
//归还连接到连接池中
jedis.close();
}
9、抽取工具类
java
package org.utils;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
/**
* 加载配置文件,文件中有一些连接池的参数
* 提供获取连接的方法
*/
public class Jedisutils {
private static JedisPool jedisPool;
//在类加载的时候读取配置文件
static {
//读取配置文件
InputStream is = Jedisutils.class.getClassLoader().getResourceAsStream("jedis.properties");
//使用properties类
Properties properties = new Properties();
try {
properties.load(is);
} catch (IOException e) {
throw new RuntimeException(e);
}
//从配置文件中获取数据,并设置到JedisPoolConfig中
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxTotal(Integer.parseInt(properties.getProperty("maxTotal")));
config.setMaxIdle(Integer.parseInt(properties.getProperty("maxIdle")));
//初始化JedisPool
jedisPool = new JedisPool(config,properties.getProperty("host"),Integer.parseInt(properties.getProperty("port")));
}
/**
* 获取连接的方法
* @return
*/
public static Jedis getJedis(){
return jedisPool.getResource();
}
}
10、使用缓存存储一些不长变化的数据,通过页面查询省份:https://github.com/musenh-hmy/demo10
java
package com.example.service.impl;
import com.example.dao.ProvinceDao;
import com.example.dao.impl.ProviceDaoInpl;
import com.example.domain.Province;
import com.example.service.ProvinceService;
import com.example.util.Jedisutils;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import redis.clients.jedis.Jedis;
import java.util.List;
public class ProvinceServiceImpl implements ProvinceService {
private ProvinceDao dao = new ProviceDaoInpl();
/**
* 使用数据库查数据
* @return
*/
@Override
public List<Province> findAll() {
return dao.findAll();
}
/**
* 使用redis缓存查数据
* @return
*/
@Override
public String findAllredis() {
//从redis中查询数据,获取redis的客户端连接
Jedis jedis = Jedisutils.getJedis();
String p = jedis.get("province");
//判断p是否为空
if(p == null || p.length() == 0){
//缓存中无数据,从数据库中查询
List<Province> ps = dao.findAll();
//将该list序列化为json
ObjectMapper mapper = new ObjectMapper();
try {
p = mapper.writeValueAsString(ps);
} catch (JsonProcessingException e) {
throw new RuntimeException(e);
}
//将数据存入redis中
jedis.set("province",p);
jedis.close();//归还连接
}else{
System.out.println("缓存中有数据,查询缓存");
}
return p;
}
}