1,Redis介绍
概念:redis是一款高性能的NOSQL系列的非关系型数据库
存储key:value
name:zhangsan
age:12
特点:(1)数据之间没有关联关系
(2)数据存储在内存中
2,什么是Redis
Redis是用C语言开发发的一个开源的高性能键值对(key-value)数据库,官方提供测试数据,50个并发执行100000个请求,读的是110000次/s,写的速度是81000次/s,且Redis通过提供多种键值数据类型来适应不同场景下的存储需求,目前为止Redis支持的键值数据类型如下:
1)字符串类型 string
2)哈希类型 hash
3)列表类型 list
4)集合类型 set
5)有序集合类型 sortedset
redis的应用场景
1)缓存(数据查询,短链接,新闻内容,商品内容)
2)聊天室的在线好友列表
3)任务队列(秒杀,抢购,12306等等)
4)应用排行耪
5)网站访问统计
6)数据过期处理(可以精确到毫秒)
7)分布式集群架构中的session分离
3,安装Redis
直接解压出来就可以使用了
*redis.windows.conf:配置文件
*redis-cli.exe:redis客户端
*redis-server.exe:redis服务器端
4,命令操作
redis的数据结构:
*redis存储的是:key,value格式的数据,其中key都是字符串,value有5种不同的数据结构
*value的数据结构:
1)字符串类型 string
2)哈希字符 hash:map格式
3)列表类型 list:linkedlist格式
4)集合类型 set: 不允许重复元素
5)有序集合类型 sortedset:不允许重复元素,且元素有顺序
(1)字符串类型string
1)存储:set key value
2)获取:get key
3)删除:del key
(2)哈希类型 hash
1)存储:hset key field value
2) 获取:
hget key field:获取指定的field对应的值
hgetall key :获取所有的field和value
3)删除:hdel key field
(3)列表list:可以添加一个元素到列表的头部(左边)或者尾部(右边)
1),添加:
lpush key value :将元素加入到列表左边
rpush key value : 将元素加入到列表右边
2),查询:
lrange key start end :范围获取
如:lrange key 0 -1 从头到尾
3),删除:
lpop key : 从列表最左边的而元素,并将元素返回
rpop key:从列表最右边的而元素,并将元素返回
(4)集合类型 set: 不允许重复元素
1),存储:sadd key value
2),获取:smembers key 获取ouset集合中所有元素
3),删除:srem key value 删除set集合中的某个元素
(5)有序集合类型 sortedset: 不允许重复元素,且元素有顺序
1),存储:zadd key score value
2),获取:zrange key start end 获取ouset集合中所有元素
如:zrange mysort 0 -1 withscores
3),删除:zrem key value
5,通用命令类型
(1)keys * :查询所有的键
(2)type key :获取键对应的value的类型
(3)del key :删除指定的key value
6,持久化
1,redis 是一个内存数据库,数据是临时的,不能被持久化的保存,当redis服务器被重启了数据将会丢失,我们可以将redis内存中的数据持久化保存在硬盘的文件中。
2,redis 持久化机制:
(1)RDB :默认方式,不需要进行配置,默认就使用这种机制
在一定的间隔时间中,检测key的变化情况,然后持久化数据
a.编辑redis.windows.conf 文件
after 900 sec (15 min) if at least 1 key changed
save 900 1
after 300 sec (5 min) if at least 10 keys changed
save 300 10
after 60 sec if at least 10000 keys changed
save 60 10000
b.重新启动redis服务器,并指定配置文件的名称
PS D:\Redis> .\redis-server.exe .\redis.windows.conf
(2)AOF:日志记录的方式,可以记录每一条命令的操作,可以每一次命令操作后
,持久化数据
a.编辑redis.windows.conf 文件
appendonly no(关闭aof) --> appendonly yes (开启aof)
appendfsync always :每一次操作都进行持久化
appendfsync everysec :每隔一秒进行一次持久化
appendfsync no:不进行持久化
7,Java客户端Jredis
Jredis:一款java操作redis数据库的工具
使用步骤:
1,下载jredis的jar包
2,使用
(1)快速入门测试
public void test1(){
// 1,获取连接
Jedis jedis = new Jedis(“localhost”,6379);
// 2,操作
jedis.set(“username”,“lisi”);
// 3.关闭连接
jedis.close();
}
(2)string数据结构的操作
public void test2(){
// 1,获取连接
Jedis jedis = new Jedis(“localhost”,6379);
// 2,存储
jedis.set(“username”,“zahngsan”);
// 3,获取
String username = jedis.get(“username”);
System.out.println(username);
// 可以使用setex()方法存储可以指定国企的时间 key value
jedis.setex("student",20,"laoma");
// 4.关闭连接
jedis.close();
}
(3)hash数据结构的操作
public void test3(){
// 1,获取连接
Jedis jedis = new Jedis(“localhost”,6379);
// 2,存储
jedis.hset(“user”,“name”,“lisa”);
jedis.hset(“user”,“age”,“23”);
jedis.hset(“user”,“gender”,“male”);
// 3,获取
String name = jedis.hget(“user”, “name”);
System.out.println(name);
// 获取hash所有的map中的数据
Map<String, String> user = jedis.hgetAll("user");
// 用keyset遍历user
Set<String> keyset = user.keySet();
for (String key : keyset) {
// 获取value
String value = user.get(key);
System.out.println(key+":"+value);
}
// 4.关闭连接
jedis.close();
}
(4)list数据结构的操作
public void test4(){
// 1,获取连接
Jedis jedis = new Jedis(“localhost”,6379);
// 2,存储
jedis.lpush(“mylist”,“a”,“b”,“c”);//从左边存
jedis.rpush(“mylist”,“a”,“b”,“c”);//从右边存
// list范围获取
List mylist = jedis.lrange(“mylist”, 0, -1);
System.out.println(mylist);
// list弹出
String element1 = jedis.lpop("mylist");
System.out.println(element1);
String element2 = jedis.rpop("mylist");
System.out.println(element2);
List<String> mylist2 = jedis.lrange("mylist", 0, -1);
System.out.println(mylist2);
// 4.关闭连接
jedis.close();
}
(5)集合set:不允许重复元素
public void test5(){
// 1,获取连接
Jedis jedis = new Jedis(“localhost”,6379);
// 2,存储
Long sadd = jedis.sadd(“myset”, “java”, “php”, “c++”);
// set 获取
Set<String> myset = jedis.smembers("myset");
System.out.println(myset);
// 4.关闭连接
jedis.close();
}
(6)sortedset:排序集合
public void test6(){
// 1,获取连接
Jedis jedis = new Jedis(“localhost”,6379);
// 2,存储
Long zadd = jedis.zadd(“sortedset”, 80, “xiaoming”);
Long zadd1 = jedis.zadd(“sortedset”, 90, “xiaohong”);
Long zadd2 = jedis.zadd(“sortedset”, 75, “zhangsan”);
// set 获取
Set<String> mysortedset = jedis.zrange("sortedset", 0, -1);
System.out.println(mysortedset);
// 4.关闭连接
jedis.close();
}
8,jedis连接池:JedisPool
使用:
1,创建JedisPool连接池对象
2,调用方法getResource()获取连接
public void test7(){
// 0,创建一个配置对象
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
jedisPoolConfig.setMaxTotal(50);// 最大允许的连接数
jedisPoolConfig.setMaxIdle(90);// 最大空闲时间,超过时间则关闭连接
// 1,获取连接池对象
JedisPool jedisPool = new JedisPool(“localhost”,6379);
// 2,获取连接
Jedis resource = jedisPool.getResource();
// 3,使用
resource.set(“who”,“hello”);
// 4.关闭连接
resource.close();
}
9,jedis的一些详细配置
#最大活动对象数
redis.pool.maxTotal=1000
#最大能够保持idel状态的对象数
redis.pool.maxIdle=100
#最小能够保持idel状态的对象数
redis.pool.minIdle=50
#当池内没有返回对象时,最大等待时间
redis.pool.maxWaitMillis=10000
#当调用borrow Object方法时,是否进行有效性检查
redis.pool.testOnBorrow=true
#当调用return Object方法时,是否进行有效性检查
redis.pool.testOnReturn=true
#“空闲链接”检测线程,检测的周期,毫秒数。如果为负值,表示不运行“检测线程”。默认为-1.
redis.pool.timeBetweenEvictionRunsMillis=30000
#向调用者输出“链接”对象时,是否检测它的空闲超时;
redis.pool.testWhileIdle=true
对于“空闲链接”检测线程而言,每次检测的链接资源的个数。默认为3.
redis.pool.numTestsPerEvictionRun=50
#redis服务器的IP
redis.ip=xxxxxx
#redis服务器的Port
redis1.port=6379
10,jedis的工具类
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
/**
- JedisPool工具类
- 加载配置文件。配置连接池的参数
- 提供获取连接的方法
*/
public class JedisPoolUtils {
private static JedisPool jedisPool;
static {
// // 读取配置文件
InputStream is = JedisPoolUtils.class.getClassLoader().getResourceAsStream(“jedis.properties”);
// // 创建Properties对象
// Properties prop = new Properties();
// // 关联文件
// try {
// prop.load(JedisPoolUtils.class.getClassLoader().getResourceAsStream(“src\main\java\util\jedis.properties”));
// } catch (IOException e) {
// e.printStackTrace();
// }
// 获取数据,设置到JedisPoolConfig中
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxTotal(50);
config.setMaxIdle(10);
// 初始化JedisPool
jedisPool= new JedisPool(config,“localhost”,6379);
}
// 获取连接方法
public static Jedis getJedis(){
return jedisPool.getResource();
}
}
11,注意:使用redis缓存一些不经常发生的数据
数据库一旦发生改变,则需要更新缓存
数据库的表执行增删改操作。需要将redis缓存数据清空,再次存入
在service对应的增删改方法中,将redis数据删除