Redis

Redis

概述

Redis 是一个开源的,使用 C 语言编写的,支持网络交互的,内存中的 Key-Value 数据结构存储系统,支持多种语言,它可以用作数据库、缓存和消息 中间件。

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

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

键值对:新闻id(键):点赞数量(值) 商品id:{id:1000,name:"华为手机,price:3000}

Redis 产品有以下特点:

 Redis 将数据存储在内存中,也支持数据的持久化,可以将内存中的数据保持 在磁盘中,重启的时候可以再次加载进行使用。

 性能极高 , Redis 能读的速度是 110000 次/s,写的速度是 81000 次/s 。  Redis 供 list,set,zset,hash 等数据结构的存储。

 原子 – Redis 的所有操作都是原子性的,同时 Redis 还支持对几个操作全 并后的原子性执行。

 Redis 分布式集群化扩展性极,高即 master-slave(主-从)模式。

为什么使用 redis

随着 web3.0 的时代到来,传统的关系型数据库在大量的访问压力出现了一些 性能问题,如连接数量问题,IO瓶颈问题等,此时需要使用redis对部分数据进行缓 存,或者将某些数据直接存储在 redis 中,以减少对关系型数据库的访问压力. 当然 redis 数据库也是不能完全替代关系型数据库的,他们是相互依赖的.

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

设置失效时间

有时候我们并不希望 redis 的 key 一直存在。例如缓存,验证码等数据,我们希 望它们能在一定时间内自动的被销毁。redis 提供了一些命令,能够让我们对 key 设置过期时间,并且让 key 过期之后被自动删除. 设置值时直接设置有效时间

EX 表示以秒为单位 PX 表示以毫秒为单位 EX,PX 不区分大小写 set name jim EX 30 设置失效时间为 30 秒 ttl 键 查看剩余时间(秒) pttl 键 查看剩余时间(毫秒) 设置值后设置有效时间 expire 键 时间(秒) pexpire 键 时间(毫秒)

redis 数据结构

5 种基本常用结构

string(字符串)

string 是 redis 最基本的类型,一个 key 对应一个 value。 string 类型是二进制安全的。意思是 redis 的 string 可以包含任何数据。比 如 jpg 图片或者序列化的对象。 string 类型是 Redis 最基本的数据类型,string 类型的值最大能存储 512MB。

单值缓存

set key value 设置值

get key 获取值

del key 删除值

keys * 查询所有值

单值缓存值可以为 json 字符串

计数器

set news_views:1 0 设置文章访问量

incr news_views:1 文章访问量+1

decr news_views:1 文章访问量-1

get news_views:1 获得值

hash(哈希)

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

在这里插入图片描述

hset key field value 存储一个哈希表 key 的键值 hset key 属性名1 属性值1 hset key 属性名2 属性值2

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

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

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

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

list(列表)

Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列 表的头部(左边)或者尾部(右边)。

lpush key value[value…] 将一个或多个值插入到 key 列表的表头(最左边)

rpush key value[value…] 将一个或多个值插入到 key 列表的表尾(最右边)

lpop key 移除并返回 key 列表的头元素

rpop key 移除并返回 key 列表的尾元素

lrange key start stop 返回列表key中指定区间内的元素,区间以偏移量start 和 stop

常见用法 Stack= LPUSH + LPOP =FILO

Queue= LPUSH + RPOP

在这里插入图片描述

set(集合 )

Redis 的 Set 是无序集合。

sadd key member[member…] 往集合 key 中存入元素,元素存在则忽略, 若 key 不存在则新建

srem key member[member…] 从集合 key 中删除元素

smembers key 获取集合 key 中所有元素

scard key 获取集合 key 的元素个数

zset(sorted set:有序集合

redis zset 也是不允许重复的成员,但是是有序的。

不同的是每个元素都会关联一个 double 类型的分数。redis 正是通过分数来为 集合中的成员进行从小到大的排序。

zset 的成员是唯一的,但分数(score)却可以重复。

zadd key score member[[score member]…] 往有序集合 key 中加入带分值元 素

zrem key member[member…] 从有序集合 key 中删除元素

zscore key member 返回有序集合 key 中元素 member 的分值

zcard key 返回有序集合 key 中元素个

在这里插入图片描述

springBoot 集成使用redis

概述

Jedis 是 Redis 官方推出的一款面向 Java 的客户端,提供了很多接口供 Java 语言调用。可以在 Redis 官网下载. Spring-data-redis 是 spring 大家族的一部分,提供了在 srping 应用中通 过简单的配置访问 redis 服务,对 reids 底层开发包(Jedis, JRedis, and RJC)进 行了高度封装,RedisTemplate 提供了 redis 各种操

spring-data-redis 针对 jedis 提供了如下功能:

  1. 连接池自动管理,提供了一个高度封装的“RedisTemplate”类.

  2. 针对 jedis 客户端中大量 api 进行了归类封装,将同一类型操作封装为 operation 接口.

    ValueOperations:简单 K-V 操作

    SetOperations:set 类型数据操作

    ZSetOperations:zset 类型数据操作

    HashOperations:针对 map 类型的数据操作

    ListOperations:针对 list 类型的数据操作

3.将事务操作封装,有容器控制。

4.针对数据的“序列化/反序列化”,提供了多种可选择策略(RedisSerializer) JdkSerializationRedisSerializer:POJO 对象的存取场景,使用 JDK 本身

序列化机制. StringRedisSerializer:Key 或者 value 为字符串的场景,根据指定的 charset 对数据的字节序列编码成 string,是“new String(bytes, charset)”和 “string.getBytes(charset)”的直接封装。是最轻量级和高效的策略。 JacksonJsonRedisSerializer:jackson-json 工具提供了 javabean 与 json 之 间的转换能力,可以将 pojo 实例序列化成 json 格式存储在 redis 中,也可以将 json 格式的数据转换成 pojo 实例。

搭建

  1. 添加 redis 依赖

    <!--连接redis-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>
    
  2. 配置连接 redis

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

    @Autowired
    RedisTemplate redisTemplate;

    @RequestMapping(path = "/redistest1")
    public void test1(){
        //获得字符串数据结构的对象
        ValueOperations valueOperations = redisTemplate.opsForValue();
       //valueOperations.set("name","zhangsan");//设置值
        //System.out.println(valueOperations.get("name"));//获得值
        //redisTemplate.delete("name");//删除键
        //System.out.println(redisTemplate.hasKey("name"));//判断键是否存在
        //redisTemplate.expire("name",20,TimeUnit.SECONDS);//为已有的键设置失效时间
        valueOperations.set("name","zhangsan",20, TimeUnit.SECONDS);
    }
}
@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;
    }
}
shKeySerializer(redisSerializer);
        redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);//value {}
        redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);

        return redisTemplate;
    }
}
  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值