Redis
概念:redis是一款高性能的NOSQL系列的非关系型数据库
Redis使用C语言开发的一个开源的高性能键值对数据库,官网提供测试数据买0个并发1000000个请求,读的速度是110000次/S 写的速度是81000次/S, 且Redis通过提供多种键值数据类型来适应不同场景下的存储需求,目前为止Redis支持键值对数据类型如下:
- 字符串类型 string
- 哈希类型 hash
- 列表类型 list
- 集合类型 set
- 有序集合类型 sortedset
应用场景:
- 缓存(数据库查询,短链接,新闻内容,商品内容等等)
- 聊天室的在线好友列表
- 任务队列(秒杀,抢购,123006等等)
- 应用排行榜
- 网站访问统计
- 数据过期处理(可以精确到毫秒)
- 分布式集群框架中的session分离
下载安装
- 官网: Redis下载
- 解压直接可以使用:
- redis.windows.conf : 配置文件
- redis-cli.exe redis的客户端
- redis-service.exe:redis的服务器端
- 命令操作
- 字符串类型 string
存储 set key values
获取 get key
删除 del key - 哈希类型 hash map格式
存储: hset key field value
获取: hset key field获取对应的值,获取所有的键和值:hegtall key
删除 hdel key field - 列表类型 list linkedlist格式,可以添加一个元素到列表的左边或者右边
lpush key value 将指定的元素加入列表左边
rpush key value 将指定元素键入列表右边
lpop key :删除处列表最左边的元素,并将元素返回
rpop kye:删除列表最右边的元素,并将元素返回
lrange key start end:返回获取元素,当是结束是-1是会查询全部数据; - 集合类型 set 不允许有重复元素
sadd key value 存储
smembers key :获取set列表集合所有元素
srem key value :删除set集合中的某个元素 - 有序集合类型 sortedset 不允许有重复元素并且会根据分值排序
zadd key score value:存储,添加相同的即可进行修改;
zrange key start end :获取,后面添加 withscores 可以将分数一起显示出来
zrem key value:删除
通用命令
- keys * :可以输入正则表格式进行;
- type key :可以知道key 的类型
- del key : 删除指定的keyvalue
持久化
redis是一个内存数据库,当redis服务器重启,获取电脑重启后,数据会丢失,我们可以将redis内存中的数据持久化保存到硬盘文件中.
redis持久化机制
-
RDB:默认方式,不需要进行配置,默认就是用这种机制;
在一定的时间间隔中,检测key的变化情况,然后持久化数据- 编辑redis.windows.conf文件
# 在900秒之后如果至少有1个key被改变就会持久化一次; save 900 1 # 300秒之后如果至少有10个key被改变就会持久化一次; save 300 10 # 60秒之后如果知道有10000个key 被改变就会持久化一次; save 60 10000
- 重新启动redis服务器并指定配置文件名称
redis-server.exe redis.windows.conf 回车运行
运行的时候,会持久化rdb文件;
-
AOF: 日志记录的方式,可以记录每一条命令的操作,可以每一次命令操作后,来持久化数据.
- 编辑redis.windows.conf文件
appendonly no(关闭aof)--> appendonly yes(开启aof)
appendfsync always:每一次操作都进行持久化
appendfsync everysec:每隔一秒进行一次持久化
appendfsync no 不进行持久化;
Java客户端 Jedis
- jedis :一款java操作redis数据库的工具
- 使用步骤
- 下载jedis的jar包:commons-pool2-2.3jar,jedis-2.7.0.jar
//1. 获取连接 Jedis jedis = new Jedis("localhost", 6379); //2.操作 jedis.set("username","zhangsan"); //3.关闭连接 jedis.close();
- Jedis操作redis中的数据结构
package com.itcast.jedis;
import org.junit.jupiter.api.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(){
//1. 获取连接
Jedis jedis = new Jedis("localhost", 6379);
//2.操作
jedis.set("username","zhangsan");
//3.关闭连接
jedis.close();
}
@Test
public void test2(){
//1. 获取连接
Jedis jedis = new Jedis();//如果使用空参构造,默认值 localhost,6379端口
//2.操作
jedis.set("username","zhangsan");
String username = jedis.get("username");
System.out.println(username);
//可以使用 setex()指定时间过期时间的key value
jedis.setex("code",20,"hehe");//将code hehe 存入redis并且20秒后删除该键值对
//3.关闭连接
jedis.close();
}
@Test
public void test3(){
//1. 获取连接
Jedis jedis = new Jedis();//如果使用空参构造,默认值 localhost,6379端口
//2.操作
jedis.hset("user","name","lisi");
jedis.hset("user","age","25");
jedis.hset("user","gender","男");
//获取hash
String hget = jedis.hget("user", "name");
System.out.println(hget);
//获取hash所有中的数据
Map<String, String> user = jedis.hgetAll("user");
//keySet便利
Set<String> strings = user.keySet();
for(String s:strings){
System.out.println(user.get(s));
}
//3.关闭连接
jedis.close();
}
@Test
public void test4(){
//1. 获取连接
Jedis jedis = new Jedis();//如果使用空参构造,默认值 localhost,6379端口
//操作
jedis.lpush("names","a","b","c");
jedis.rpush("names","a","b","c");
List<String> names = jedis.lrange("names", 0, -1);
System.out.println(names);
String names1 = jedis.lpop("names");
String names2 = jedis.rpop("names");
System.out.println(names1);
System.out.println(names2);
List<String> names11 = jedis.lrange("names", 0, -1);
for (String s:names11){
System.out.print(s);
}
//3.关闭连接
jedis.close();
}
@Test
public void test5(){
//1. 获取连接
Jedis jedis = new Jedis();//如果使用空参构造,默认值 localhost,6379端口
//操作
Long sadd = jedis.sadd("language", "java", "c++", "php");
Set<String> myset = jedis.smembers("language");
System.out.println(myset);
//3.关闭连接
jedis.close();
}
@Test
public void test6(){
//1. 获取连接
Jedis jedis = new Jedis();//如果使用空参构造,默认值 localhost,6379端口
//操作
Long sadd = jedis.zadd("yx", 33,"java");
Long hy = jedis.zadd("yx", 5,"hy");
Long wuk = jedis.zadd("yx", 11,"swk");
Set<String> myset = jedis.zrange("yx",0,-1);
System.out.println(myset);
//3.关闭连接
jedis.close();
}
}
Jedis连接池JedisPool
- 使用
- 创建jedisPool连接池对象
- 调用方法:getResource()方法获取Jedis链接
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
jedisPoolConfig.setMaxTotal(50);//最大链接数量
jedisPoolConfig.setMaxIdle(10);//空闲链接数
//1.创建jedis对象
JedisPool jedisPool = new JedisPool(jedisPoolConfig,"127.0.0.1",6379);
Jedis resource = jedisPool.getResource();
resource.set("name","张三");
String name = resource.get("name");
System.out.println(name);
resource.close();//归还到jedisPool连接池中
JedisPool工具类
**
* 加载配置文件,配置连接池的参数
* 提供连接的方法
*/
public class JedisPoolUtils {
private static JedisPool jedisPool;
static{
//读取jedis.properties文件信息
InputStream is = JedisPoolUtils.class.getClassLoader().getResourceAsStream("jedis.properties");
//创建properties
Properties ps = new Properties();
try {
ps.load(is);
} catch (IOException e) {
throw new RuntimeException(e);
}
JedisPoolConfig jg = new JedisPoolConfig();
jg.setMaxTotal(Integer.parseInt(ps.getProperty("maxTotal")));
jg.setMaxTotal(Integer.parseInt(ps.getProperty("maxIdle")));
//初始化jedisPool
jedisPool = new JedisPool(jg, ps.getProperty("host"), Integer.parseInt(ps.getProperty("port")));
}
public static Jedis getJedis(){
return jedisPool.getResource();
}
}
Properties
host=127.0.0.1
port=6379
maxTotal=50
maxIdle=10
- 编辑redis.windows.conf文件
appendonly no(关闭aof)--> appendonly yes(开启aof)
appendfsync always:每一次操作都进行持久化
appendfsync everysec:每隔一秒进行一次持久化
appendfsync no 不进行持久化;
Java客户端 Jedis
- jedis :一款java操作redis数据库的工具
- 使用步骤
- 下载jedis的jar包:commons-pool2-2.3jar,jedis-2.7.0.jar
//1. 获取连接 Jedis jedis = new Jedis("localhost", 6379); //2.操作 jedis.set("username","zhangsan"); //3.关闭连接 jedis.close();
- Jedis操作redis中的数据结构
package com.itcast.jedis;
import org.junit.jupiter.api.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(){
//1. 获取连接
Jedis jedis = new Jedis("localhost", 6379);
//2.操作
jedis.set("username","zhangsan");
//3.关闭连接
jedis.close();
}
@Test
public void test2(){
//1. 获取连接
Jedis jedis = new Jedis();//如果使用空参构造,默认值 localhost,6379端口
//2.操作
jedis.set("username","zhangsan");
String username = jedis.get("username");
System.out.println(username);
//可以使用 setex()指定时间过期时间的key value
jedis.setex("code",20,"hehe");//将code hehe 存入redis并且20秒后删除该键值对
//3.关闭连接
jedis.close();
}
@Test
public void test3(){
//1. 获取连接
Jedis jedis = new Jedis();//如果使用空参构造,默认值 localhost,6379端口
//2.操作
jedis.hset("user","name","lisi");
jedis.hset("user","age","25");
jedis.hset("user","gender","男");
//获取hash
String hget = jedis.hget("user", "name");
System.out.println(hget);
//获取hash所有中的数据
Map<String, String> user = jedis.hgetAll("user");
//keySet便利
Set<String> strings = user.keySet();
for(String s:strings){
System.out.println(user.get(s));
}
//3.关闭连接
jedis.close();
}
@Test
public void test4(){
//1. 获取连接
Jedis jedis = new Jedis();//如果使用空参构造,默认值 localhost,6379端口
//操作
jedis.lpush("names","a","b","c");
jedis.rpush("names","a","b","c");
List<String> names = jedis.lrange("names", 0, -1);
System.out.println(names);
String names1 = jedis.lpop("names");
String names2 = jedis.rpop("names");
System.out.println(names1);
System.out.println(names2);
List<String> names11 = jedis.lrange("names", 0, -1);
for (String s:names11){
System.out.print(s);
}
//3.关闭连接
jedis.close();
}
@Test
public void test5(){
//1. 获取连接
Jedis jedis = new Jedis();//如果使用空参构造,默认值 localhost,6379端口
//操作
Long sadd = jedis.sadd("language", "java", "c++", "php");
Set<String> myset = jedis.smembers("language");
System.out.println(myset);
//3.关闭连接
jedis.close();
}
@Test
public void test6(){
//1. 获取连接
Jedis jedis = new Jedis();//如果使用空参构造,默认值 localhost,6379端口
//操作
Long sadd = jedis.zadd("yx", 33,"java");
Long hy = jedis.zadd("yx", 5,"hy");
Long wuk = jedis.zadd("yx", 11,"swk");
Set<String> myset = jedis.zrange("yx",0,-1);
System.out.println(myset);
//3.关闭连接
jedis.close();
}
}
Jedis连接池JedisPool
- 使用
- 创建jedisPool连接池对象
- 调用方法:getResource()方法获取Jedis链接
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
jedisPoolConfig.setMaxTotal(50);//最大链接数量
jedisPoolConfig.setMaxIdle(10);//空闲链接数
//1.创建jedis对象
JedisPool jedisPool = new JedisPool(jedisPoolConfig,"127.0.0.1",6379);
Jedis resource = jedisPool.getResource();
resource.set("name","张三");
String name = resource.get("name");
System.out.println(name);
resource.close();//归还到jedisPool连接池中
JedisPool工具类
**
* 加载配置文件,配置连接池的参数
* 提供连接的方法
*/
public class JedisPoolUtils {
private static JedisPool jedisPool;
static{
//读取jedis.properties文件信息
InputStream is = JedisPoolUtils.class.getClassLoader().getResourceAsStream("jedis.properties");
//创建properties
Properties ps = new Properties();
try {
ps.load(is);
} catch (IOException e) {
throw new RuntimeException(e);
}
JedisPoolConfig jg = new JedisPoolConfig();
jg.setMaxTotal(Integer.parseInt(ps.getProperty("maxTotal")));
jg.setMaxTotal(Integer.parseInt(ps.getProperty("maxIdle")));
//初始化jedisPool
jedisPool = new JedisPool(jg, ps.getProperty("host"), Integer.parseInt(ps.getProperty("port")));
}
public static Jedis getJedis(){
return jedisPool.getResource();
}
}
Properties
host=127.0.0.1
port=6379
maxTotal=50
maxIdle=10
案例分析
- 提过index.html页面,页面中有一个省份 下拉列表
- 当页面加载完成后,发送ajax请求,加载所有省份
案例地址:
https://gitee.com/yan-chenglong1/text-reids
- 注意:使用redis缓存一些不经常发生变化的数据.
- 数据库的数据一旦发生改变,则需要更新缓存.
- 数据库对应的表去执行了增删改的相关操作,我们需要将redis数据清空,再次存储;
- service对应的增三改2方法中,将redis数据删除.
- 数据库的数据一旦发生改变,则需要更新缓存.
网友评论