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

进入到这个界面并修改配置:

aop操作redis_json


启动成功样式:

aop操作redis_json_02


进入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);
    }

错误分析:

aop操作redis_Test_03


这是未连接上虚拟机的端口

@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);
    }

输出

aop操作redis_Test_04


第一个输出我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

aop操作redis_redis_05