Redis的数据类型及如何在Java中操作Redis,配置连接池

Redis的数据类型及如何在Java中操作Redis,配置连接池

介绍

什么是redis,常用开发场景是什么

在这里插入图片描述

Redis是一个基于内存的key-value数据库,它是[Remote Dictionary Servicel]的首字母缩写,也就是远程字典服务。

基于诶存存储,读写性能高

适合存储热点数据(热点商品、资讯、新闻)

企业应用广泛

Redis介绍

Redis 是一个开源 (BSD 许可证)、内存中的数据结构存储,用作数据库、缓存、消息代理和流处理引擎。Redis 提供了字符串、哈希、列表、集合、有序集合、位图、HyperLogLogs、地理空间索引和流等数据结构。Redis 内置了复制Lua 脚本LRU 淘汰事务、不同级别的持久化,并通过Redis Sentinel提供高可用性,并通过Redis Cluster进行自动分区。

你可以在这些类型上运行 原子操作 ,比如向字符串追加递增哈希中的值向列表中推送元素计算集合的交集并集差集; 或者获取排序集中排名最高的成员

要实现最佳性能,Redis与内存数据集配合工作。根据您的用例,Redis可以通过定期将数据集转储到磁盘或通过将每个命令附加到基于磁盘的日志来持久化数据。如果您只需要一个功能丰富的网络化内存缓存,还可以禁用持久化。

Redis支持异步复制,具有快速的非阻塞同步和在网络分裂时的自动重新连接和部分重新同步功能。

NoSql(Not Only Sql),不仅仅是sql,泛指非关系型数据库(数据库之间没有关系),并不是要取代关系型数据库,而是关系型数据库的补充。

数据库排行榜:

在这里插入图片描述

使用Redis能做什么

数据缓存

消息队列等等

在这里插入图片描述

Redis的数据类型(面试常考)

数据类型介绍

Redis的五种数据类型

redis是一种高级的key-value的存储系统,键是string类型,其中value支持五种数据类型,对于键和值的描述如下所示:

键(key):

[1] 键不能重复

[2] 作用:标识存储的数据

[3] 数据类型:String

[4] 命名规则:

​ 1)不能太长:因为查询效率低,查询起来不方便

​ 2)不能太短:容易重复,并且可读性差

​ 3)按照规范:HEIMA_STU_LIST

值(value):支持五种数据类型

string					字符串类型,类似于java中string
hash					由键值对组成,类似于java中的map
list					列表类型,类似于java中的list,元素存取有序,可以重复
set						集合类型,类似于java中的set,元素存取无序,不可重复
sorted set/zset          有序的集合类型,每个元素有一个分数来决定他的顺序

String类型的操作命令

字符串类型String

字符串类型是Redis中最为基础的数据存储类型,它在Redis中以二进制保存,无论存入的是字符串、整数、浮点类型都会以字符串写入

在Redis中字符串类型的值最多可以容纳的数据长度是512M,这是以后最常用的数据类型

在这里插入图片描述

常用命令

更多命令可以参考redis中文网

在这里插入图片描述

补充:
批量操作:
mset name lisi   addr sh
mget name   age   addr
del  name  age

使用场景

用户登录后端保存短信验证码,并设置失效时间;

代替后端session功能,实现分布式缓存(是将数据分散存储在多台独立的设备上)等

小结

1.添加值:set 键 值

2.获取值:get 键

3.删除值:del 键

hash类型的操作命令

概述

Redis中的Hash类型可以看成是键和值都是string类型的Map容器,每一个hash可以存储4G个键值对
在这里插入图片描述

该类型非常适合于存储对象的信息。如一个用户有姓名,密码,年龄等信息,则可以有username,password,age等键。它的存储结构如下:

在这里插入图片描述

常用命令

命令功能
hset 键 字段 值添加键,字段,值
hget 键 字段通过键,字段得到值
hmset 键 字段 值 字段 值multiply多个,一次添加多个字段和值
hmget 键 字段 字段通过键,获取多个字段和值
hdel 键 字段 字段删除一个或多个字段的值
hgetall 键得到这个键下所有的字段和值
HKEYS 键获取hash表中所有字段
HVALS 键获取hash表中所有值

使用场景

购物车

以用户id为key,商品id为field,商品数量为value,恰好构成了购物车的三个要素,如下图所示:

在这里插入图片描述

小结

功能hash类型的操作命令
添加值hset
得到值hget
删除值hdel
添加多个字段hmset
得到多个字段值hmget
得到所有的字段值hgetall

list类型 的操作命令

概述

​ 在redis 中,List类型是按照插入顺序排序的字符串链表。和数据结构中的普通链表一样,我们可以在其左部和右部添加新的元素。在插入时,如果该键并不存在,redis将为该键创建一个新的链表。与此相反,如果链表中所有的元素均被移除,那么该键也将会被从数据库中删除,List中可以包含的最大元素数量是4G个

在这里插入图片描述

常用命令

在这里插入图片描述

使用场景

—微信朋友圈点赞,要求按照点赞顺序显示好友信息,如果取消点赞,移除对应好友信息

—list类型的range命令可以分页查看队列中的数据。可将每隔一段时间计算的排行榜存储在list类型中,如京东每日的手机销量排行、学校每次月考学生的成绩排名等

小结

​ 1.从左边添加元素:lpush

​ 2.从右边添加元素:rpush

​ 3.从左边删除元素:lpop

​ 4.从右边删除元素:rpop

​ 5.得到指定范围的元素:lrange

​ 6.得到列表的长度:llen

set类型的操作命令

概述

​ 在Redis中,我们可以将set类型看作为没有排序的字符集合,和LIst类型一样,我们也可以在该类型的数值上执行添加、删除或判断某一元素是否存在等操作。Set可包含的最大元素数量是4G,和List类型不同的是,Set集合中不允许出现重复的元素。

常用命令

在这里插入图片描述

应用场景

需要去重的少量信息,比如:身份证信息、手机号码等作为黑名单|白名单

共同好友查询,使用set的交集

​ eg:zhang:{11,22,33,44} lisi:{22,33,66,88}

​ zhangsan和lisi的共同好友:交集取22 33 即可

小结

1.添加元素:sadd

2.删除元素:srem

3.得到所有元素:smembers

4判断元素是否存在:sismember

zset/sorted set类型的操作命令

概述

Redis有序集合(sorted set)和set集合一样也是无序不可重复。不同的是每个元素都会关联一个分数(排序因子)。

redis正是通过分数来为集合中的成员进行从小到大的排序

有序集合的成员是唯一的,但分数(score)却可以重复,每个集合可以存储40多亿个成员

在这里插入图片描述

常用命令

在这里插入图片描述

应用场景

b站视频点击量排名
新浪热点文章点击量、收藏量等排名

小结

命令行为
zadd添加
zrange查询
zrem删除
zcard个数
zrank索引号
zscore得到分数

Redis的其他操作

Redis的通用命令

在这里插入图片描述

在java中操作Redis

介绍

java程序中如何操作Redis呢?这就需要使用redis的Java客户端,就像用JDBC操作MySQL数据库一样。

Redis的java客户端很多,官方推荐的有三种:

Jedis

Lettuce

Redisson

spring对Redis客户端进行了整合,提供了SpringData Redis,在Springboot项目中还提供了对应的Starter,即spring-boot-starter-data-redis

Spring Data Redis(重点)

介绍

Spring Data Redis是Spring的一部分,提供了在Spring应用中通过简单的配置就可以访问redis服务,对redis底层开发包进行了高度封装。在Spring项目中,可以使用Spring Data Redis来简化Redis操作。

Maven坐标:

<dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-redis</artifactId>
    <version>2.4.8</version>
</dependency>

Spring Boot提供了对应的Starter,Maven坐标

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

Spring Data Redis中提供了一个高度封装的类:RedisTemplate,针对类似jedis客户端中大量api进行了归类封装,将同一类型操作封装为operation接口,具体分类如下:

ValueOperations:简单K-V操作(String类型)
SetOperations:set类型数据操作
ZSetOperations:zset类型数据操作
HashOperations:针对hash类型的数据操作
ListOperations:针对list类型的数据操作

使用方式

环境搭建

1.创建Maven项目,配置pom.xml文件

2.编写启动类

3.配置application.yml

spring:
	#redis相关配置
	redis:
		host: 192.168.200.128 # 链接linux系统的redis
		port: 6379 #端口号
		database: 0 #操作的是0号数据库

解释说明:

spring.redis.database:指定使用redis的哪个数据库,redis服务器启动后默认有16个数据库,编号分别从0-15,可以通过配置文件来指定数据库的数量

4.提供测试类

操作字符串类型数据
常见命令

在这里插入图片描述

代码实现
  /**
     * @description string设置 key和 value的值
     */
    public void set(String key, Object value) {
        redisTemplate.opsForValue().set(key, value);
    }
 
    /**
     * @description string设置 key和 value的值并设置过期时间和时间单位
     */
    public void setWithExpire(String key, Object value, Long seconds, TimeUnit timeUnit) {
        redisTemplate.opsForValue().set(key, value, seconds, timeUnit);
    }
 
    /**
     * @description string获取 key对应的 value值
     */
    public Object get(String key) {
        return redisTemplate.opsForValue().get(key);
    }
 
    /**
     * @description 判断在 redis中是不是存在对应的 key值,有的话就返回 true,没有就返回 false
     */
    public Boolean hasKey(String key) {
        return redisTemplate.hasKey(key);
    }
 
    /**
     * @description 删除redis中对应的key值 
     */
    public Boolean del(String key) {
        return redisTemplate.delete(key);
    }
操作哈希类型数据
常见命令

在这里插入图片描述

代码实现
  /**
     * @description 新增map值
     */    
    public void put(String key, Object field, Object value) {
        redisTemplate.opsForHash().put(key, field, value);
    }
 
    /**
     * @description 以map集合的形式添加键值对
     */
    public void putAll(String key, Map<Object, Object> map) {
        redisTemplate.opsForHash().putAll(key, map);
    }
 
    /**
     * @description 获取 map中指定的 key值,如果存在则返回值,没有就返回null
     */
    public Object getMapValue(String key, String field) {
        return redisTemplate.opsForHash().get(key, field);
    }
 
    /**
     * @description 根据 key获取 Map对象
     */
    public Map<Object, Object> getMap(String key) {
        return redisTemplate.opsForHash().entries(key);
    }
 
    /**
     * @description 当 hashKey不存在的时候,进行设置 map的值
     */
    public Boolean putIfAbsent(String key, Object hashKey, Object value) {
        return redisTemplate.opsForHash().putIfAbsent(key, hashKey, value);
    }
操作列表类型数据
常见命令

在这里插入图片描述

代码实现
	/**
     * @description 把值添加在 list
     */
    public Long leftPush(String key, Object... values) {
        return redisTemplate.opsForList().leftPushAll(key, values);
    }
 
    /**
     * @description 直接把一个新的 list添加到老的 list上面去
     * @return java.lang.Long
     */
    public Long leftPushAll(String key, List<Object> value) {
        return redisTemplate.opsForList().leftPushAll(key, value);
    }
 
    /**
     * @description List存在的时候就加入新的值
     */
    public long leftPushIfPresent(String key, Object value) {
        return redisTemplate.opsForList().leftPushIfPresent(key, value);
    }
 
    /**
     * @description 把值添加在 list的最后面
     */
    public long rightPush(String key, Object value) {
        return redisTemplate.opsForList().rightPush(key, value);
    }
 
    /**
     * @description 根据索引获取 list中的值
     */
    public Object index(String key, long index) {
        return redisTemplate.opsForList().index(key, index);
    }
 
    /**
     * @description 获取 list中开始索引到结束索引的所有值
     */
    public List<Object> range(String key, long start, long end) {
        return redisTemplate.opsForList().range(key, start, end);
    }

操作set集合类型数据
常见命令

在这里插入图片描述

代码实现
/**
     * @description 添加元素到 set中
     */
    public Long add(String key, Collection<Object> values) {
        return redisTemplate.opsForSet().add(key, values);
    }
 
    /**
     * @description 从 set中删除一个随机元素,并返回该元素
     */
    public Object pop(String key) {
        return redisTemplate.opsForSet().pop(key);
    }
 
    /**
     * @description 获取 set集合的大小
     */
    public Long sizeSet(String key) {
        return redisTemplate.opsForSet().size(key);
    }
 
    /**
     * @description 判断 set集合中是否存在value值
     */
    public Boolean isMember(String key, Object value) {
        return redisTemplate.opsForSet().isMember(key, value);
    }
 
    /**
     * @description 获取两个集合的交集并返回一个集合
     */
    public Set<Object> intersect(String key, String otherKey) {
        return redisTemplate.opsForSet().intersect(key, otherKey);
    }
操作有序集合类型数据
常见命令

在这里插入图片描述

代码实现
  /**
     * @description 添加元素到 zset,从小到大排序
     */
    public Boolean add(String key, Object value, double score) {
        return redisTemplate.opsForZSet().add(key, value, score);
    }
 
    /**
     * @description 返回 zset元素在集合的从小到大排名
     */
    public Long rank(String key, Object object) {
        return redisTemplate.opsForZSet().rank(key, object);
    }
 
    /**
     * @description 返回 zset元素在集合的由大到小排名
     */
    public Long reverseRank(String key, Object object) {
        return redisTemplate.opsForZSet().reverseRank(key, object);
    }
 
    /**
     * @description 获取 zset集合中指定区间的元素
     */
    public Set<ZSetOperations.TypedTuple<Object>> reverseRangeWithScores(String key, long start, long end) {
        return redisTemplate.opsForZSet().reverseRangeWithScores(key, start, end);
    }
 
    /**
     * @description 查询 zset集合中的元素并从小到大排序
     */
    public Set<Object> reverseRangeByScore(String key, double min, double max) {
        return redisTemplate.opsForZSet().reverseRangeByScore(key, min, max);
    }

整合连接池

关于redis连接池并没有什么效果,配置好之后会优化获取连接性能

pom引入依赖:

<!-- redis创建连接池,默认不会创建连接池 -->
<dependency>
	<groupId>org.apache.commons</groupId>
    <artifactid>commons-pool2</artifactid>
</dependency>

配置连接池:

#配置redis环境
spring:
	#redis相关配置
	redis:
		host: 192.168.200.128 # 链接linux系统的redis
		port: 6379 #端口号
		database: 0 #操作的是0号数据库
		lettcure: 
			pool:
				max-active: 8 # 连接池最大连接数(使用负值表示没有限制)
				max-wait: -lms # 连接池最大阻塞等待时间(使用负值表示没有限制)
				max-idle: 8 # 连接池中的最大空闲连接
				min-idle: 1 # 连接池中的最小空闲连接
  • 34
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值