Redis

1、关系型与非关系型数据库对比

Redis_第1张图片

2、非关系型数据库优点及应用场景

分布式ID

Redis_第2张图片

3、BitMap 存二进制数据(0101010)、HyperLogLog(数据统计(少))

4、redis的命令参数

(1)String字符串命令

set 设定值 SET key "value"
setnx key不存在时设置key值
setex 为指定的 key 设置值及其过期时间,存在会替换值 SETEX mykey 60 redis 单位秒
get 获取指定的值
incr 自增1  incr hello:lht:page_view
decr 自减1 decr hello:lht:page_view
INCRBY  INCRBY rank 20 增加20

(2)key键命令

exists key  判断键是否存在
expire key time 给键设置过期时间
del key 删除键
ttl 键 查看键的有效时间

(3)List命令

关注,收藏,点赞,队列

lpush 将一个或多个值插入到列表头部
rpush 在列表中添加一个或多个值
lpop 移出并获取列表的第一个元素
rpop 移除并获取列表最后一个元素
llen 获取列表长度
lrange 获取列表指定范围内的元素

(4)set命令

Redis_第3张图片

sadd 向集合添加一个或多个成员
spop 移除并返回集合中的一个随机元素
scard 获取集合的成员数
sdiff 返回给定所有集合的差集
sunion 返回所有给定集合的并集
sinter 返回给定所有集合的交集

 (5)zset 有序不重复

应用:排行榜、热搜

Zincrby 键 分数 值 zincrby hot:search 1 '葫芦娃'
Zrevrange 返回有序集中,指定区间内的成员(按分数值递减(从大到小)来排列)
ZREVRANGE salary 0 -1

(6)Hash

Redis_第4张图片

 5、redis原始语句

Redis_第5张图片

6、问题

​​​​​​​Redis_第6张图片

7、java链接redis的客服端

Redis_第7张图片

8、日志输出

Redis_第8张图片

Redis_第9张图片

9、键通过RestTeplate操作,值通过ValueOperations及以下去操作

Redis_第10张图片

10、redis配置

(1)导包


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

(2)配置序列化

package com.smart.community.youth.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.core.ValueOperations;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

@Configuration
public class RedisConfig {

    /**
     * 序列化配置
     * json序列化 jdk的序列化
     * @param connectionFactory
     * @return
     */
    @Bean
    public RedisTemplate redisTemplate(RedisConnectionFactory connectionFactory){
        RedisTemplate redisTemplate = new RedisTemplate<>();

        redisTemplate.setConnectionFactory(connectionFactory);

        /**
         * 四个设置
         * 1 键的序列化
         * 2 值的序列
         */
        StringRedisSerializer keyRedisSerializer = new StringRedisSerializer();
        redisTemplate.setStringSerializer(keyRedisSerializer);
        redisTemplate.setHashKeySerializer(keyRedisSerializer);
        redisTemplate.setKeySerializer(keyRedisSerializer);

        GenericJackson2JsonRedisSerializer genericJackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
        redisTemplate.setHashKeySerializer(genericJackson2JsonRedisSerializer);
        redisTemplate.setValueSerializer(genericJackson2JsonRedisSerializer);
        return redisTemplate;


    }

    @Bean
    public ValueOperations valueOperations(RedisTemplate redisTemplate) {
        return redisTemplate.opsForValue();
    }

}

(3)配置yml配置文件

server:
  port: 8089

spring:
  redis:
    host: 127.0.0.1
    database: 0
    port: 6379
    password: ""
    # 默认单位毫秒
    timeout: 5s
    # 连接池
    jedis:
      pool:
        #  最大连接数
        max-active: 10
        #  空闲连接数数
        max-idle: 8
        # 空闲最小链接数
        min-idle: 2
        max-wait: 3s
  profiles:
    active: "db,dev,swagger"

logging:
  level:
    "com.smart.community.youth": debug

(4)测试对象

package com.smart.community.youth.vo;

import lombok.Data;

@Data
public class UserVo {
    private String username;
}

(5)测试

package com.zw.data.redis.mapper;

import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;

import javax.annotation.Resource;
import java.time.Duration;
import java.util.concurrent.TimeUnit;

@SpringBootTest
@Slf4j
public class KeyRedisTemplateTest {
    @Resource
    RedisTemplate redisTemplate;

    @Test
    public void hasKey() {
        Boolean b = redisTemplate.hasKey("test:key:exists");
        Boolean delete = redisTemplate.delete("test:key:exists");
        redisTemplate.expire("test:key:exists", Duration.ofSeconds(1));
        redisTemplate.expire("test:key:exists", 1, TimeUnit.SECONDS);
        log.debug("" + b);
    }
}
package com.zw.data.redis.mapper;

import com.zw.data.redis.vo.SysUserVo;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;

import javax.annotation.Resource;
import java.time.Duration;

@SpringBootTest
public class StringRedisTemplateTest {
    @Resource
    RedisTemplate redisTemplate;
    @Resource
    ValueOperations valueOperations;

    // 设置永不过期
    // 设置过期时间  nx
    // 存在不设置值
    // 不存在就设置值
    @Test
    public void setTest() {
        valueOperations.set("test:str:set", "永不过期");
        valueOperations.set("test:str:set:ex", "设置过期时间", Duration.ofMinutes(10));
        // 键不存在则设置值
        valueOperations.setIfAbsent("test:str:set:nx", "键不存在则设置值");
        // 修改操作
        valueOperations.setIfPresent("test:str:set:nx", "键不存在则设置值");

        SysUserVo sysUserVo = new SysUserVo();
        sysUserVo.setUsername("admin");
        valueOperations.set("test:str:set:obj", sysUserVo);
    }

    @Test
    public void incr() {
        Long num = valueOperations.increment("test:str:set:incr");
        Long num1 = valueOperations.decrement("test:str:set:incr");

    }


}

11、Duration 时间类使用

Redis_第11张图片

还有1d(一天) 2h(2小时)那些

12、缓存的原理

通过AOP去缓存里面取,取key 类名+方法名+参数+特殊区分符

13、配置了Bean注入之后

Redis_第12张图片

这边引入一下就直接用了

Redis_第13张图片

14、把RedisTemplate那些方法封装到DAO中去

Redis_第14张图片

Redis_第15张图片

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