Bootstrap

Redis

目录

架构

概念

作用

Linux下使用docker安装redis

创建 redis 配置文件和数据映射挂载卷

复制 redis.conf 文件到/opt/redis/conf 目录下

拉取镜像

安装命令

连接redis 

redis数据结构

string(字符串)

Hash(哈希)

List(列表)

Set(集合)

zset(sorted set:有序集合)

设置失效时间

springBoot中集成使用redis

搭建

1、添加依赖

2、配置连接redis

3、注入RedisTemplate

4、测试

序列化键值


架构

概念

redis是一个高性能的,键值对的,将数据存储在内存中的非关系型数据库(nosql数据库 not only sql)

高性能:数据存储在内存中,直接访问内存。

键值对:新闻id(键):点赞数量(值)

               商品id(id:1000,name:"华为手机",price:3000)

非关系型数据库:数据存储是键值对的,没有二维关系  不使用sql操作

作用

使用redis作为缓存,将一些访问量大或者修改较少的数据使用redis存储起来,对mysql形成保护。

Linux下使用docker安装redis

创建 redis 配置文件和数据映射挂载卷

mkdir -p /opt/redis/conf

mkdir -p /opt/redis/data

 

复制 redis.conf 文件到/opt/redis/conf 目录下

注意,此文件已设置密码为 123

允许远程连接访问

拉取镜像

docker pull redis:6.0

安装命令

docker run -d -p 6379:6379 \

--name redis \

--restart=always \

--privileged=true \

-v /opt/redis/conf/redis.conf:/etc/redis/redis.conf \

-v /opt/redis/data:/data \

redis:6.0

连接redis 

docker exec -it redis bash

redis-cli

redis数据结构

redis中数据存储是键值对的

键是字符串类型

值有五种数据结构

string(字符串)

最常用的

场景:单值存储 存储一个字符串的值  name  age  json字符串  验证码  计数器 

set key value

get key

del key 

keys *

incr key 让值自增1 要求值为整数

decr key 让值自减1

Hash(哈希)

适合一个键存储多个属性值的场景,例如用户信息  新闻点赞,收藏信息

hset key field value 存储一个哈希表 key 的键值

hget key field 获取哈希表 key 对应的 field 键值

hdel key field 删除哈希表 key 中的 field 键值

hlen key 返回哈希表 key 中的 field 的数量

hgetall key 返回哈希表 key 中所有的键

List(列表)

lpush key value

rpush key value

lpop key 

rpop key

lrange key 开始位置 结束位置 查询列表指定区间的元素 

Set(集合)

无序不重复

sadd key value1 value2

srem key value

smembers key 查看集合中所有元素 

scard key 查看集合中元素个数

zset(sorted set:有序集合)

可以排序的 不重复元素集合

zadd key 分数 值

zrem key 值 

zscore key member 返回值的分数

zcard key 查看集合中元素个数 

设置失效时间

EX 表示以秒为单位

PX 表示以毫秒为单位 EX,PX 不区分大小写

set name jim EX 30 设置失效时间为 30 秒

ttl 键 查看剩余时间(秒)

pttl 键 查看剩余时间(毫秒)

springBoot中集成使用redis

redis官方提供一个jedis的客户端类,连接redis数据库 new jedis("ip","端口"),set(key,value)

现在使用spring中封装的RedisTemplate类实现Java程序和redis的连接操作

搭建

1、添加依赖

        <!--redis依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

2、配置连接redis

  redis:
    host: 192.168.163.128
    port: 6379
    password: 123
    database: 0
    pool:
      max-active: 8 # 连接池最大连接数(使用负值表示没有限制)
      max-wait: -1ms # 连接池最大阻塞等待时间(使用负值表示没有限制)
      max-idle: 8 # 连接池中的最大空闲连接
      min-idle: 0 # 连接池中的最小空闲连接
      timeout: 5000ms # 连接超时时间(毫秒)

3、注入RedisTemplate

package com.ffyc.news.config;


import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

@Configuration
public class RedisConfig {

    /**
     * 序列化键,值
     * @param connectionFactory
     * @return
     */
    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(connectionFactory);
        //序列化策略
        Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<Object>(Object.class);
        StringRedisSerializer redisSerializer = new StringRedisSerializer();

        redisTemplate.setKeySerializer(redisSerializer);//key 单一的字符串
        redisTemplate.setHashKeySerializer(redisSerializer);
        redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);//value {}
        redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);

        return redisTemplate;
    }
}

4、测试

package com.ffyc.news.web;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.HashOperations;
import org.springframework.data.redis.core.ListOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.concurrent.TimeUnit;

@RestController
public class RedisTest {

    @Autowired
    RedisTemplate redisTemplate;

    @RequestMapping(path = "redistest1")
    public void test(){

        //;来获得操作字符串数据结构的对象
        ValueOperations valueOperations = redisTemplate.opsForValue();
        valueOperations.set("name", "zhangsan");//设置值
        System.out.println(valueOperations.get("name"));//获得值

        //设置失效时间
        //valueOperations.set("name", "zhangsan", 20, TimeUnit.SECONDS);

        redisTemplate.delete("name");//删除键
        System.out.println(redisTemplate.hasKey("name"));//判断键是否存在
        //valueOperations.increment("newsid");//让键自增

        //Hash        
        /*HashOperations hashOperations = redisTemplate.opsForHash();
        hashOperations.put("age", 1, 20);*/
    }
}

package com.ffyc.news.web;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.HashOperations;
import org.springframework.data.redis.core.ListOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.concurrent.TimeUnit;

@RestController
public class RedisTest {

    @Autowired
    RedisTemplate redisTemplate;

    @RequestMapping(path = "redistest1")
    public void test(){

        redisTemplate.delete("");//删除键
        redisTemplate.hasKey("");//判断键是存在
        redisTemplate.expire("a", 10, TimeUnit.SECONDS);//为我们已有的键设置失效时间
        ValueOperations valueOperations = redisTemplate.opsForValue();
        /*valueOperations.set("", "");
        valueOperations.get("");
        valueOperations.increment("");
        valueOperations.decrement("");*/
        
        //hash
        //HashOperations hashOperations = redisTemplate.opsForHash();
        //list
        ListOperations listOperations = redisTemplate.opsForList();

    }
}

序列化键值

需要被 Redis 缓存的类,必须实现序列化接口

redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer<User>(User.class));
;