1.什么是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)。
2.redis在linux中的安装:
1.在官网下载redis
2.利用Linux辅助工具将下载好的redis文件包加入到工作目录 /usr/local/src
3.解压安装包(以5.0.4为参考)
tar -xzvf redis-5.0.4.tar.gz
4.重命名:
mv redis-5.0.4 redis
5.进入redis文件包
cd redis
6.安装:
依次输入以下两个命令
make #对文件进行编译
makeinstall #对redis进行安装
3.redis常用命令:
3.1 Linux输入的linux指令
1.配置文件的启动方式:
前端启动方式(不建议使用:不修改配置文件直接输入Linux启动命令)
后端启动方式(修改了配置文件,再次输入Linux启动命令)
在linux中的启动方式
//linux启动命令
redis-server redis.conf
后端启动方式之配置文件的修改
在Linux控制台输入
vim redis.conf
//进入vim中再次输入Esc,输入以下命令会出现行号:
:set nu
进入到这个界面并修改配置:
启动成功样式:
进入redis命令:第一步:找到redis的端口号 :
ps -ef | grep redis
第二步:输入进入端口命令
//6379是端口号
redis-cli -p 6379
3.2在客户端输入的指令:
3.2.1String类型
//命令 说明 案例
//set 添加key-value
set username admin
//get 根据key获取数据
get username
//strlen 根据key获取值的长度
strlen key
//exists 判断key是否存在
exists name //返回1存在 0不存在
//del 删除redis中的key
del key
//Keys 用于查询符合条件的key
keys * //查询redis中全部的key
keys n?me //使用占位符获取数据
keys nam* //获取nam开头的数据
mset 赋值多个key-value
mset key1 value1 key2 value2 key3 value3
mget 获取多个key的值
mget key1 key2
append 对某个key的值进行追加
append key value
type 检查某个key的类型
type key
select 切换redis数据库
select 0-15 //redis中共有16个数据库
flushdb //清空单个数据库
flushall //清空全部数据库
//incr 自动加1
incr key
//decr 自动减1
decr key
//incrby 指定数值添加
incrby 10
//decrby 指定数值减
decrby 10
//expire 指定key的生效时间 单位秒
expire key 20 //key20秒后失效
//pexpire 指定key的失效时间 单位毫秒
pexpire key 2000//key 2000毫秒后失效
//ttl 检查key的剩余存活时间
ttl key // -2数据不存在 -1该数据永不超时
//persist 撤销key的失效时间
persist key
3.2.2Hash类型
说明:可以用散列类型保存对象和属性值
例子:User对象{id:2,name:小明,age:19}
命令 说明 案例
hset 为对象添加数据 hset key field value
hget 获取对象的属性值 hget key field
hexists 判断对象的属性是否存在 HEXISTS key field
1表示存在 0表示不存在
hdel 删除hash中的属性 hdel user field [field ...]
hgetall 获取hash全部元素和值 HGETALL key
hkyes 获取hash中的所有字段 HKEYS key
hlen 获取hash中所有属性的数量 hlen key
hmget 获取hash里面指定字段的值 hmget key field [field ...]
hmset 为hash的多个字段设定值 hmset key field value [field value ...]
hsetnx 设置hash的一个字段,只有当这个字段不存在时有效 HSETNX key field value
hstrlen 获取hash中指定key的值的长度 HSTRLEN key field
hvals 获取hash的所有值 HVALS user
3.2.3List类型
说明:Redis中的List集合是双端循环列表,分别可以从左右两个方向插入数据.
List集合可以当做队列使用,也可以当做栈使用
队列:存入数据的方向和获取数据的方向相反
栈:存入数据的方向和获取数据的方向相同
命令 说明 案例
//lpush 从队列的左边入队一个或多个元素
LPUSH key value [value ...]
//rpush 从队列的右边入队一个或多个元素
RPUSH key value [value ...]
//lpop 从队列的左端出队一个元素
LPOP key
//rpop 从队列的右端出队一个元素
RPOP key
//lpushx 当队列存在时从队列的左侧入队一个元素
LPUSHX key value
//rpushx 当队列存在时从队列的右侧入队一个元素
RPUSHx key value
//lrange 从列表中获取指定返回的元素
LRANGE key start stop
Lrange key 0 -1 //获取全部队列的数据
lrem //从存于 key 的列表里移除前 count 次出现的值为 value 的元素。 这个 count 参数通过下面几种方式影响这个操作:
count > 0: //从头往尾移除值为 value 的元素。
count < 0: //从尾往头移除值为 value 的元素。
count = 0: //移除所有值为 value 的元素。 LREM list -2 “hello” 会从存于 list 的列表里移除最后两个出现的 “hello”。
/*需要注意的是,如果list里没有存在key就会被当作空list处理,所以当 key 不存在的时候,这个命令会返回 0。*/
//Lset 设置 index 位置的list元素的值为 value
LSET key index value
3.2.4Redis事务命令
说明:redis中操作可以添加事务的支持.一项任务可以由多个redis命令完成,如果有一个命令失败导致入库失败时.需要实现事务回滚.;
命令 说明 案例
multi 标记一个事务开始 127.0.0.1:6379> MULTI
OK
exec 执行所有multi之后发的命令 127.0.0.1:6379> EXEC
OK
discard 丢弃所有multi之后发的命令
4.redis在springboot中的应用
4.1 jar包的引入
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-redis</artifactId>
</dependency>
4.2 入门案列:
4.2.1 string类型的入门案例
@Test
public void testRedis01(){
Jedis jedis = new Jedis("192.168.126.129",6379);
jedis.set("2004","今天下雨放假不");
String val = jedis.get("2004");
System.out.println(val);
}
错误分析:
这是未连接上虚拟机的端口
@Test
public void testRedis02() {
Jedis jedis = new Jedis("192.168.126.129", 6379);
//1.判断redis中是否存在key
if (jedis.exists("2004")) {
//2.如果存在则设定超时时间
jedis.expire("2004", 100);
}
//3.线程暂停2秒
try {
Thread.sleep(2000);
//4.获取剩余的存活时间
Long time = jedis.ttl("2004");
System.out.println("还能活:" + time);
//5.撤销删除操作
jedis.persist("2004");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//高级应用
@Test
public void testRedis03() {
Jedis jedis = new Jedis("192.168.126.129", 6379);
jedis.setnx("boss", "码云");
jedis.setnx("boss", "马化腾");
System.out.println(jedis.get("boss"));
}
@Test
public void testRedis04() {
Jedis jedis = new Jedis("192.168.126.129", 6379);
jedis.setex("aa", 20, "000");
}
/**
* 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
public void testRedis05() {
Jedis jedis = new Jedis("192.168.126.129", 6379);
SetParams setParams = new SetParams();
jedis.set("aa", "000");
setParams.nx().ex(20);
jedis.set("aa","111",setParams);
System.out.println(jedis.get("aaa"));
}
4.2.2 hash类型的入门案例
Test
public void testHashRedis01() {
Jedis jedis = new Jedis("192.168.126.129", 6379);
jedis.hset("person","name","tomcat");
jedis.hset("person","age","100");
Map<String, String> map = jedis.hgetAll("person");
System.out.println(map);
}
4.2.3 hash类型的入门案例
@Test
public void testListRedis01() {
Jedis jedis = new Jedis("192.168.126.129", 6379);
jedis.lpush("list","1,2,3,4,5");
jedis.lpush("list1","1","2","3","4","5");
String value = jedis.rpop("list");
String value1 = jedis.rpop("list1");
System.out.println(value);
System.out.println(value1);
}
输出
第一个输出我1,2,3,4,5原因:该对象是一个可变的字符串类型,所以他的输出是一个字符串
第二个输出的是 1 原因:该对象是一个字符串的集合,它的输出一般按队列或者是栈的方式进行输出
4.2.4 事务的入门案例
@Test
public void testTransactionRedis() {
Jedis jedis = new Jedis("192.168.126.129", 6379);
Transaction transaction = jedis.multi(); //开启事务
try{
transaction.set("aa","aa");
transaction.set("bb","aa");
transaction.set("cc","aa");
transaction.exec(); //提交事务
}catch (Exception e){
e.printStackTrace();
transaction.discard(); //提交失败,回滚事务
}
}
5 springboot整合redis
5.1 创建properties和配置类
//#配置redis.properties
redis.host=192.168.126.129
redis.port=6379
创建配置类
@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);
}
}
6 如何将保存到redis中
6.1 业务
说明:由于redis中一般使用string数据类型来保存业务数据,但是Java对象redis没办法直接保存,所以需要中间的转化过程,所以需要借助JSON这个对象来存储数据
List java 对象 -----JSON----Redis使用string数据类型保存
测试json转换
package com.jt.test;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.jt.pojo.ItemDesc;
import org.junit.jupiter.api.Test;
import java.util.Date;
public class TestObjectMapper {
private static final ObjectMapper MAPPER = new ObjectMapper();
@Test
public void test01(){
ItemDesc itemDesc = new ItemDesc();
itemDesc.setItemId(100l).setItemDesc("测试时间转化")
.setCreated(new Date()).setUpdated(itemDesc.getCreated());
try {
String json = MAPPER.writeValueAsString(itemDesc);
System.out.println(json);
ItemDesc itemDesc2 = MAPPER.readValue(json, ItemDesc.class);
//利用反射机制实例化对象,再利用get/set为对象赋值
System.out.println(itemDesc2);
} catch (Exception e) {
e.printStackTrace();
}
}
}
6.3 工具类的编写
package com.jt.utils;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
public class ObjetMapperUtil {
//1.创建工具API的对象
private static final ObjectMapper MAPPER = new ObjectMapper();
//将对象转化为json
public static String toJSON(Object object){
if (object==null){
throw new RuntimeException("传入的对象不能为空");
}
try {
String json = MAPPER.writeValueAsString(object);
return json;
} catch (JsonProcessingException e) {
e.printStackTrace();
throw new RuntimeException(e.getMessage());
}
}
/**
* 将JSON转化为指定的对象,用户输入的是什么数据类型,将转化为什么样的数据类型
*/
public static <T> T toObject(String json,Class<T> target){
//检验参数是否有效
if (json==null||json.equals("")||target==null)
throw new RuntimeException("输入的参数有误");
try {
T t = MAPPER.readValue(json, target);
return t;
} catch (JsonProcessingException e) {
e.printStackTrace();
throw new RuntimeException(e.getMessage());
}
}
}
6.4工具类的测试
@Test
public void test02(){
ItemDesc itemDesc = new ItemDesc();
itemDesc.setItemId(100l).setItemDesc("测试时间转化")
.setCreated(new Date()).setUpdated(itemDesc.getCreated());
String toJSON = ObjetMapperUtil.toJSON(itemDesc);
ItemDesc itemDesc1 = ObjetMapperUtil.toObject(toJSON, itemDesc.getClass());
System.out.println(itemDesc1);
}
7. 关闭redis的方法
两种方式
方法一:关闭redis的端口号
redis-cli -p 6379 shutdown
方法二:关闭redis的进程号 ,
查找进程
ps -ef | grep redis
关闭进程
kill -9 1752