Redis

一、基于Docker安装Redis

 (1)拉取镜像

docker pull redis:6.2.6

(2)创建并启动容器

docker run -d --name redis -p 6379:6379 --restart always redis:6.2.6

(3)进入redis客户端工具

docker exec -it redis redis-cli

二、Redis简介

Redis是以Key-Value形式进行存储的NoSQL数据库。 Redis是使用C语言进行编写的。

平时操作的数据都在内存中,效率特高,读的效率110000次/s,写81000次/s,所以多把Redis当做缓存工具使用(在一些框架中还把Redis当做临时数据存储工具)。缓存工具:把数据库中数据缓存到Redis中,由于Redis读写性能较好,访问Redis中数据,而不是频繁访问数据库中数据。

Redis以slot(槽)作为数据存储单元,每个槽中可以存储N多个键值对。Redis中固定具有16384个槽。理论上可以实现一个槽是一个Redis。每个向Redis存储数据的key都会进行crc16算法得出一个值后对16384取余就是这个key存放的solt位置。  

虽然槽的大小是不固定的,但是Redis一个键值对最大大小为512M(String 类型Value)同时通过Redis Sentinel(哨兵)提供高可用,通过Redis Cluster(集群)提供自动分区。  

 三、Redis常见命令

 (1)key

        del key  删除
        keys *    查看所有key
        exists key 判断key是否存在
        type key 查看key的类型
        ttl key 查看key的剩余过期时间,单位秒。永久数据返回-1

(2)String类型value值操作命令

        set key value : 设置值。如果值存在覆盖。
        get key : 查询key的value值
        setex key seconds value: 设置key并给定过期时间。如果key存在覆盖。
        incr key: 对key的值加一
        incrby key 数值: 对key的值增加或减少

(3)Hash类型value值操作命令

        hset key field value:给key添加一个属性值
        hmset key field value  field value : 给key添加多个属性值

        hget key field: 获取某个属性的值
        hmget key field field:获取多个属性的值
        hgetall key : 取出所有属性值

        hkeys key: 获取所有属性名
        hvals key: 获取所有属性值

        hdel key field field: 删除多个属性
        hexists key field: 判断属性是否存在
        hlen key :获取里面有多少个属性

(4)list类型value值操作命令

        lpush key value: 向列表最左端插入
        rpush key value: 向列表最右端插入
        linsert key before|after 值  新值: 向值的前面或后面插入新值
        lrange key 起始脚标  结束脚标: 查询列表一个区间的值
        lrange key 0 -1: 查询全部

        lrem key count value:删除count个value

        llen key: 长度

(5)set类型value值操作命令 

        sadd key value value: 新增多个值。值是不能重复,没有顺序。
        smembers key : 查询全部
        scard key: 长度

(6)sorted set类型value值操作命令

        zadd key score value score value:插入多个值,每个值必须绑定一个数值。
        zrange key 0 -1:升序查询
        zrem key value:删除
        zrevrange key 0 -1:降序查询

(7)stream类型value值操作命令

        xadd key id field value: 插入值。

        id可以是*自动生成,也可以是具体值,但是具体值必须大于目前存在的id的最大值。


        xrange key - +:查询全部。

四、使用Spring Boot整合Spring Data Radis

(1)导入依赖


      org.springframework.boot
      spring-boot-starter-data-redis

(2)配置redis地址

spring.redis.host=ip地址

(3)新建配置类

package com.bjsxt.config;

import org.springframework.context.annotation.Bean;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import org.springframework.stereotype.Component;

@Component
public class RedisConfig {

    @Bean
    public RedisTemplate redisTemplate(RedisConnectionFactory factory) {
        RedisTemplate stringObjectRedisTemplate = new RedisTemplate<>();
        //配置key使用的序列化器
        stringObjectRedisTemplate.setKeySerializer(new StringRedisSerializer());
        //配置value使用的序列化器
        stringObjectRedisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
        //注入redis工程类
        stringObjectRedisTemplate.setConnectionFactory(factory);
        return stringObjectRedisTemplate;
    }

}

(4)使用

package com.bjsxt.service.impl;

import com.bjsxt.mapper.UserMapper;
import com.bjsxt.pojo.User;
import com.bjsxt.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private RedisTemplate redisTemplate;
    @Autowired
    private UserMapper userMapper;
    @Override
    public User selectById(int id) {
        //从redis中获取
        User user = (User) redisTemplate.opsForValue().get("user");
        if(user!=null && user.getId()==id){
            return user;
        }
        User user1 = userMapper.selectById(id);
        //保存到redis中
        redisTemplate.opsForValue().set("user",user1);
        return user1;
    }
}

(5)方法

只要是Spring Data 的子项目被Spring Boot整合后都会有一个XXXXTemplate示实例。把Redis不同值得类型放到一个opsForXXX方法中。

  1. opsForValue : String值(最常用),如果存储Java对象或Java中集合时就需要使用序列化器,将对象序列化成JSON字符串。

  2. opsForList : 列表List

  3. opsForHash: 哈希表Hash

  4. opsForZSet: 有序集合Sorted Set

  5. opsForSet : 集合

五、Spring Data Redis 序列化器介绍

(1)JdkSerializationRedisSerializer

是RedisTemplate类默认的序列化方式。JdkSerializationRedisSerializer使用JDK自带的序列化方式。

(2)OxmSerializer

以字符串格式的xml存储。解析起来也比较复杂,效率也比较低。

(3)StringRedisSerializer

只能对String类型序列化操作。

(4)GenericToStringSerializer

需要调用者给传递一个对象到字符串互转的Converter(转换器),使用比较麻烦。

(5)Jackson2JsonRedisSerializer

该序列化器可以将对象自动转换为Json的形式存储,效率高且对调用者友好。

(6)GenericJackson2JsonRedisSerializer

与Jackson2JsonRedisSerializer功能相似。底层依然使用Jackson工具包。相比Jackson2JsonRedisSerializer多了_class列,列里面存储类(新增时类型)的全限定路径,从Redis取出时根据_class类型进行转换,解决了泛型问题。

你可能感兴趣的:(redis,缓存,数据库)