redis 缓存
介绍
**Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。 它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets)**与范围查询, bitmaps, hyperloglogs 和 地理空间(geospatial) 索引半径查询。 Redis 内置了 复制(replication),LUA脚本(Lua scripting), LRU驱动事件(LRU eviction),事务(transactions) 和不同级别的 磁盘持久化(persistence), 并通过 Redis哨兵(Sentinel)和自动 分区(Cluster)提供高可用性(high availability).
速度快:
tomcat: 150-220/秒
nginx: 3-5万/秒
redis: 写 8.6万/秒 读 11.2万/秒 ~ 平均10万次/秒
redis 缓存机制机制介绍
说明 : 使用缓存机制的主要目的就是为了降低用户访问物理设备(数据库)的频次,从缓存服务器中直接获取数据,快速的相应用户,提高整体的查询速度,用户体验更好。
- 缓存机制采用的是key - value key必须唯一
- 采用的是c语言进行开发
- 运行环境是在内存中
- 因为内存中的数据断电即擦除,redis使用持久化(写入磁盘)的方式进行保存数据
- 采用LRU算法进行内存优化
redis 安装
下载地址
安装 redis
将下载好的安装包 解压 输入命令 (不建议 使用最新版本 下面演示 使用的是5.04 版本)
tar -xvf redis-6.0.6.tar.gz\?_ga\=2.84668761.1119595938.1597553332-1312809166.1597553332
进入redis解压好的目录进行 编译 和安装
编译 make
安装 make install
启动 redis
要求 :进入redis的根目录中执行
特点 : redis每次启动都会读取配置文件,如果需要启动多台redis 则需要准备多个配置文件
启动命令 : redis-server redis.conf
成功 演示
redis 开启 后台运行 修改 redis配置文件redis.conf
1.修改ip 地址绑定 vim redis.conf 显示行号 :set nu
2.取消 保护模式
3.开启 后台运行
4. 后台 运行效果
5.关闭 redis
命令 :ps -ef | grep redis //检索 redis 服务
命令 kill -9 12606 停止 指定 redis
命令 redis-cli -p 6379 shutdown 停止 指定 端口号的redis
命令 redis-cli -p 6379 进入redis 的客户端中 6379位redis的默认端口 如果进入的是默认端口可以不写-p 6379
redis 入门 案例
添加 jar包
<!--spring整合redis -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-redis</artifactId>
</dependency>
编辑测试 api
package com.jt.test;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.Transaction;
import redis.clients.jedis.params.SetParams;
import java.util.Map;
@SpringBootTest //加上这个注解表示 需要依赖spring容器 进行操作 从容器中获取对象 如果不需要容器注入对象则可以不写
public class TestRedis {
/**
* 通过spring整合第三方框架 自动注入值
*/
@Autowired
private Jedis jedis;
/**
* Redis 入门案例
* 测试报错 检查linux的防火墙 检查 redis的配置
*/
@Test
void testRedis(){
String host="192.168.126.129";//host 主机ip地址 ip写安装redis的主机ip
//创建redis对象
//Jedis jedis =new Jedis(host,6379);
//1.向Redis中存取数据 在java中叫 Jedis
jedis.set("aa", "下雨了");
//2.获取数据
String aa = jedis.get("aa");
System.out.println(aa);
}
@Test
void testRedis2(){
String host="192.168.126.129";//host 主机ip地址 ip写安装redis的主机ip
//创建redis对象
Jedis jedis =new Jedis(host,6379);
//1.判断是否存在某个key
if (jedis.exists("aa")){
//如果存在 设定超时时间 100秒以后失效
jedis.expire("aa", 100);
//线程暂停2秒
try {
Thread.sleep(2000);
Long ttl = jedis.ttl("aa");
System.out.println("还能活"+ttl);
} catch (InterruptedException e) {
e.printStackTrace();
}
jedis.persist("aa");
}
}
/**
* redis 是key value 结构
* 当进行赋值是 一定要确定 key中是否有值
*/
@Test
void testRedis3(){
String host="192.168.126.129";//host 主机ip地址 ip写安装redis的主机ip
//创建redis对象
Jedis jedis =new Jedis(host,6379);
//1.向Redis中存取数据 在java中叫 Jedis
jedis.set("boss", "下雨了");
jedis.flushDB();
if (jedis.exists("boss")){
System.out.println("数据已存在");
}else{
jedis.set("boss", "没下雨");
}
//key 如果存在 则不会添加
jedis.setnx("boss", "潘石屹");
System.out.println(jedis.get("boss"));
}
/**
* 为数据添加时间 保证原子性操作
* 原子性:一起完成 一起回滚
* 小结 : setnx 如果可以存在 则不对key赋值
* setex 保证原子性操作 并且添加超时时间
*/
@Test
void testRedis4(){
String host="192.168.126.129";//host 主机ip地址 ip写安装redis的主机ip
//创建redis对象
Jedis jedis =new Jedis(host,6379);
jedis.setex("aaa", 20, "123456");//一起执行 满足原子性执行
// jedis.set("aa", "2135");
// jedis.expire("aa", 20);
}
/**
* private static final String XX = "xx"; key存在才能赋值
* private static final String NX = "nx"; 只有key不存在时才能赋值
* private static final String PX = "px"; 毫秒
* private static final String EX = "ex"; 秒
*/
@Test
void testRedis5(){
String host="192.168.126.129";//host 主机ip地址 ip写安装redis的主机ip
//创建redis对象
Jedis jedis =new Jedis(host,6379);
SetParams setParams=new SetParams();
setParams.nx().ex(20);
jedis.set("abcd", "54555",setParams );
System.out.println(jedis.get("abcd"));
}
/**
* 测试hash数据类型
*/
@Test
void testRedis6(){
String host="192.168.126.129";//host 主机ip地址 ip写安装redis的主机ip
//创建redis对象
Jedis jedis =new Jedis(host,6379);
jedis.hset("person", "name", "tomcat");
jedis.hset("person", "age", "100");
Map<String, String> person = jedis.hgetAll("person");
System.out.println(person);
}
/**
* 测试list集合数据类型
*/
@Test
void testRedis7(){
String host="192.168.126.129";//host 主机ip地址 ip写安装redis的主机ip
//创建redis对象
Jedis jedis =new Jedis(host,6379);
jedis.lpush("list", "1" , "2 ", "3", "4", "5");
String list = jedis.rpop("list");
System.out.println(list);
}
/**
* 实现redis 的事物控制
*/
@Test
void testRedis8(){
String host="192.168.126.129";//host 主机ip地址 ip写安装redis的主机ip
//创建redis对象
Jedis jedis =new Jedis(host,6379);
Transaction multi = jedis.multi();
try {
multi.set("aa", "sdss");
multi.exec();//执行事物
}catch(Exception e){
multi.discard();//回滚事物
}
}
}
spring 整合redis
# 配置单台redis
redis.host=192.168.126.129
redis.port=6379
编辑配置类
package com.jt.config;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import redis.clients.jedis.Jedis;
@Configuration //标识我是配置类
@PropertySource("classpath:/properties/redis.properties")
public class RedisConfig {
@Value("${redis.host}")
private String host;
@Value("${redis.port}")
private Integer port;
@Bean
public Jedis jedis(){
//数据写死?????????
return new Jedis(host,port);
}
}