Redis基础知识(一)

一 Redis的数据类型

1.1 基本数据类型:

String(字符串)        Hash(哈希表)         List(列表)              Set(集合)         ZSet(有序集合)        

1.2 特殊类型

GEO(地理空间)        HyperLogLog(基数统计)        bitMap(位图)        bitField(位域) Stream(流)

 

 二、类型详解

2.1 String(字符串)

        2.1.1 概念

                string是字符串类型,可以分成三种1.string(普通字符串);2.int(整数类型)可以自增自减

;3.float(浮点型)可以做自增自减.String类型的最大空间不超过512MB,String结构将对象序列化为JSON后存储

        2.1.2常用指令
  • SET:添加或者修改已经存在的一个String类型的键值对
  • GET:根据key获取String类型的value
  • MSET:批量添加多个String类型的键值对
  • MGET:根据多个key获取多个String类型的value
  • INCR:让一个整型的key自增1
  • INCRBY:让一个整型的key自增并指定步长,例如:incrby num 2 让num值自增2
  • INCRBYFLOAT:让一个浮点类型的数字自增并指定步长
  • SETNX:添加一个String类型的键值对,前提是这个key不存在,否则不执行(等价于set + nx)
  • SETEX:添加一个String类型的键值对,并且指定有效期(等价于set+ex)

 

2.2 Hash(哈希表)

        2.2.1 概念

                也叫散列表,他的value是无序字典,类似于Java中的Map

        2.2.2 常用命令
  • HSET key field value:添加或者修改hash类型key的field的值
  • HGET key field:获取一个hash类型key的field的值
  • HMSET key field1 value1 field2 value2 ...:批量添加多个hash类型key的field的值
  • HMGET key field1 field2 ...:批量获取多个hash类型key的field的值
  • HGETALL key:获取一个hash类型的key中的所有的field和value
  • HKEYS key:获取一个hash类型的key中的所有的field
  • HVALS:获取一个hash类型的key中的所有的value
  • HINCRBY:让一个hash类型key的字段值自增并指定步长,例如,hincrby heima:user:4 age -2 (age自减2)
  • HSETNX:添加一个hash类型的key的field值,前提是这个field不存在,否则不执行

2.3 List(列表)

        2.3.1 概念:

类似于Java的LinkedList(双向链表),支持从头扫到尾,也支持从尾扫头,

       2.3.2  常用命令
  • LPUSH key element ... :向列表左侧插入一个或多个元素
  • LPOP num:从左侧开始取,取出并移除num个元素,数量不够就返回nil
  • RPUSH key element ... :向列表右侧插入一个或多个元素
  • RPOP num:从右侧开始取,取出并移除num个元素,数量不够就返回nil
  • LRANGE key star end:返回一段角标范围内的所有元素
  • BLPOP和BRPOP:与LPOP和RPOP类似,只不过在没有元素时等待指定时间,而不是直接返回nil

 即v2编号为1,v1编号为2

2.4 Set类型

        2.4.1 概念

        类似于java的Set,具有HashSet的特性,同时适合交并集,微博用他来表示你们的共同好友

        2.4.2 常用指令
  • SADD key member ... :向set中添加一个或多个元素
  • SREM key member ... : 移除set中的指定元素
  • SCARD key: 返回set中元素的个数
  • SISMEMBER key member:判断一个元素是否存在于set中
  • SMEMBERS:获取set中的所有元素
  • SINTER key1 key2 ... :求key1与key2的交集
  • SDIFF key1 key2 ... :求key1与key2的差集
  • SUNION key1 key2 ...:求key1和key2的并集

练习:

sadd zs ls ww zlsadd ls ww zg;scard zssinter zs lssdiff zs lssunion zs lssismember zs lssismember ls zssrem zs ls

 2.5 ZSet

        2.5.1 概念

        一个可排序的set集合,与Java中的TreeSet有些类似,但底层数据结构却差别很大。SortedSet中的每一个元素都带有一个score属性,可以基于score属性对元素排序,底层的实现是一个跳表(SkipList)加 hash表。SortedSet具有的特点:可排序元素、不重复、查询速度快。因为SortedSet的可排序特性,经常被用来实现排行榜这样的功能

        2.5.3 常用指令
  •     ZADD key score member:添加一个或多个元素到sorted set ,如果已经存在则更新其score值
  •     ZREM key member:删除sorted set中的一个指定元素
  •     ZSCORE key member : 获取sorted set中的指定元素的score值
  •     ZRANK key member:获取sorted set 中的指定元素的排名
  •     ZCARD key:获取sorted set中的元素个数
  •     ZCOUNT key min max:统计score值在给定范围内的所有元素的个数
  •     ZINCRBY key increment member:让sorted set中的指定元素自增,步长为指定的increment值
  •     ZRANGE key min max:按照score排序后,获取指定排名范围内的元素
  •     ZRANGEBYSCORE key min max:按照score排序后,获取指定score范围内的元素
  •     ZDIFF、ZINTER、ZUNION:求差集、交集、并集

三、实战

导入maven依赖

        <!--jedis依赖--><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>3.7.0</version></dependency><!--junit依赖--><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter</artifactId><version>5.7.0</version><scope>test</scope></dependency><!--SpringBoot整合SpringDataRedis对应的Starter--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><!--Redis连接池依赖--><dependency><groupId>org.apache.commons</groupId><artifactId>commons-pool2</artifactId></dependency>
 3.1 Jedis连接池
package com.hhxy.jedis.util;import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;/*** @author ghp* @date 2022/12/25* @title* @description*/
public class JedisConnectionFactory {private static final JedisPool jedisPool;static {// 配置连接JedisPoolConfig poolConfig = new JedisPoolConfig();// 配置线程池能够处理的线程数量(默认值是8,能够处理的包括工作线程和阻塞线程)poolConfig.setMaxTotal(8);// 配置线程池能够工作的线程数量(默认值是8)poolConfig.setMaxIdle(8);// 配置线程池最小的空闲连接(默认值是0)poolConfig.setMinIdle(0);// 等待空闲线程的时间poolConfig.setMaxWaitMillis(1000);// 创建连接池对象jedisPool = new JedisPool(poolConfig,"192.168.88.130", 6379, 1000,  "32345678");}public static Jedis getJedis(){return jedisPool.getResource();}}
 3.2 yml里面配置redis基本连接信息
  redis:port: 6379host: 192.168.59.133password: picMemotimeout: 1800000lettuce:pool:max-active: 20max-wait: -1
3.3 测试

- **Step4**:测试```java
package com.hhxy;import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;@SpringBootTest
class SpringbootSpringdateRedisApplicationTests {@Autowiredprivate RedisTemplate redisTemplate;@Testvoid contextLoads() {}@Testpublic void testString(){// 存入String类型的数据redisTemplate.opsForValue().set("name","ghp");// 获取存入的数据Object name = redisTemplate.opsForValue().get("name");System.out.println("name = " + name);}}
3.4 自定义RedisTemple,

解决中文存入问题,因为RedisTemplate底层序列化,默认使用的JDK序列化,本质上是ObjectOutputStream

maven

 <!--lombok依赖--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><!--SpringBoot整合SpringDataRedis对应的Starter--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><!--Redis连接池依赖--><dependency><groupId>org.apache.commons</groupId><artifactId>commons-pool2</artifactId></dependency><!--Jackson依赖--><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId></dependency><!--SpringBoot整合Junit对应的Starter--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency>
package com.hhxy.redis.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.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializer;/*** @author ghp* @date 2022/12/25* @title* @description*/
@Configuration
public class RedisConfig {@Beanpublic RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory){// 创建RedisTemplate对象RedisTemplate<String, Object> template = new RedisTemplate<>();// 设置连接工厂template.setConnectionFactory(connectionFactory);// 创建JSON序列化工具GenericJackson2JsonRedisSerializer jsonRedisSerializer = new GenericJackson2JsonRedisSerializer();// 设置key的序列化template.setKeySerializer(RedisSerializer.string());template.setHashKeySerializer(RedisSerializer.string());// 设置value的序列化template.setValueSerializer(jsonRedisSerializer);template.setHashValueSerializer(jsonRedisSerializer);// 返回序列化后的结果return template;}
}

 为了避免内部开销,j我们选择用String 序列化器,则是StringRedisTemplate(默认提供)

package com.hhxy.redis;import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.hhxy.redis.pojo.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.StringRedisTemplate;/*** @author ghp* @date 2022/12/25* @title* @description 通过采用String序列化器+手动序列化反序列化Object类型的value*/
@SpringBootTest
public class RedisStringTest {@Autowiredprivate StringRedisTemplate stringRedisTemplate;@Testpublic void testString(){// 存入String类型的数据(直接使用Spring提供的StringRedisTemplate就行了)stringRedisTemplate.opsForValue().set("name","张三");// 获取存入的数据Object name = stringRedisTemplate.opsForValue().get("name");System.out.println("name = " + name);}// ObjectMapper是SpringMVC默认的JSON处理工具private static final ObjectMapper mapper = new ObjectMapper();@Testpublic void testObject() throws JsonProcessingException {// 创建User对象(需要手动序列化和反序列化,其实可以通过AOP封装一个方法)User user = new User("张三", 21);// 手动序列化String json = mapper.writeValueAsString(user);// 将数据存入Redis中stringRedisTemplate.opsForValue().set("user",json);// 获取存入的数据String name = stringRedisTemplate.opsForValue().get("user");// 手动反序列化User user1 = mapper.readValue(json, User.class);System.out.println("user1 = " + user1);}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/634675.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

架构的演进

1.1单体架构 单体架构也称之为单体系统或者是单体应用。就是一种把系统中所有的功能、模块耦合在一个应用中的架构方式。 存在的问题&#xff1a; 代码耦合&#xff1a;模块的边界模糊、依赖关系不清晰&#xff0c;整个项目非常复杂&#xff0c;每次修改代码都心惊胆战迭代困…

RabbitMQ 部署与配置[CentOS7]

# RabbitMQ,Erlang 版本包对应 https://rabbitmq.com/which-erlang.html#eol-seriescd /usr/local/src# Erlang下载 # https://github.com/rabbitmq/erlang-rpm/releases https://github.com/rabbitmq/erlang-rpm/releases/download/v23.3.4.5/erlang-23.3.4.5-1.el7.x86_64.rp…

NTFS 磁盘管理器---NTFS Disk by Omi NTFS中文

NTFS Disk by Omi NTFS是一款专为Mac用户设计的NTFS磁盘管理工具。它可以帮助用户方便地访问和管理NTFS格式的硬盘、U盘、移动硬盘以及其他存储设备&#xff0c;并提供高效稳定的NTFS卷管理功能。该软件具有简单的用户界面&#xff0c;使用户能够快速访问和管理NTFS磁盘上的文件…

ChatGPT给出的前端面试考点(Vue.js)

ChatGPT给出的前端面试考点&#xff08;Vue.js&#xff09; 答案 1. Vue.js是什么&#xff1f;它的主要特点是什么&#xff1f; Vue.js是一个渐进式JavaScript框架&#xff0c;用于构建用户界面。它的主要特点包括&#xff1a; 数据绑定&#xff1a;Vue.js使用双向数据绑定&…

图灵日记之java奇妙历险记--String类

目录 String常用方法字符串构造String对象的比较字符串查找char charAt(int index)int indexOf(int ch)int indexOf(int ch, int fromIndex)int indexOf(String str)int indexOf(String str, int fromIndex)int lastIndexOf(String str)int lastIndexOf(String str, int fromIn…

OceanBase集群扩缩容

​ OceanBase 数据库采用 Shared-Nothing 架构&#xff0c;各个节点之间完全对等&#xff0c;每个节点都有自己的 SQL 引擎、存储引擎、事务引擎&#xff0c;天然支持多租户&#xff0c;租户间资源、数据隔离&#xff0c;集群运行的最小资源单元是Unit&#xff0c;每个租户在每…

OPC UA 开源库编译方法及通过OPC UA连接西门S7-1200 PLC通信并进行数据交换

前言 在现代工业自动化领域&#xff0c;OPC UA&#xff08;开放性生产控制和统一架构&#xff09;是一种广泛应用的通信协议。本文将以通俗易懂的方式解释OPC UA的含义和作用&#xff0c;帮助读者更好地理解这一概念。 一、OPC UA的定义 OPC UA全称为“开放性生产控制和统一…

Labview实现用户界面切换的几种方式---通过VI间相互调用

在做用户界面时我们的程序往往面对的对象是程序使用者&#xff0c;复杂程序如果放在同一个页面中&#xff0c;往往会导致程序冗长卡顿&#xff0c;此时通过多个VI之间的切换就可以实现多个界面之间的转换&#xff0c;也会显得程序更加的高大上。 本文所有程序均可下载&#xff…

【Python机器学习】多分类问题的不确定度

decision_function和predict_proba也适用于多分类问题。还是以鸢尾花数据集为例&#xff1a; from sklearn.ensemble import GradientBoostingClassifier from sklearn.datasets import make_circles,load_iris import numpy as np from sklearn.model_selection import train_…

【总结】Dinky学习笔记

概述 Dinky 是一个开箱即用、易扩展&#xff0c;以 Apache Flink 为基础&#xff0c;连接 OLAP 和数据湖等众多框架的一站式实时计算平台&#xff0c;致力于流批一体和湖仓一体的探索与实践 官网&#xff1a;Dinky 核心特性 沉浸式&#xff1a;提供专业的 DataStudio 功能&a…

1979-A threshold selection method from gray-level histograms

1 论文简介 《A threshold selection method from gray-level histograms》是由日本学者大津于 1979 年发表在 IEEE TRANSACTIONS ON SYSTEMS 上的一篇论文。该论文提出了一种基于图像灰度直方图的阈值化方法&#xff0c;计算简单&#xff0c;且不受图像亮度和对比度的影响&am…

64.Spring事件监听的核心机制是什么?

Spring事件监听的核心机制是什么? spring的事件监听有三个部分组成 事件(ApplicationEvent) 负责对应相应监听器 事件源发生某事件是特定事件监听器被触发的原因监听器(ApplicationListener) 对应于观察者模式中的观察者。监听器监听特定事件,并在内部定义了事件发生后的响应…

【论文阅读】ControlNet、文章作者 github 上的 discussions

文章目录 IntroductionMethodControlNetControlNet for Text-to-Image DiffusionTrainingInference Experiments消融实验定量分析 在作者 github 上的一些讨论消融实验更进一步的探索Precomputed ControlNet 加快模型推理迁移控制能力到其他 SD1.X 模型上其他 Introduction 提…

烟火检测/区域人流统计/AI智能分析网关V4如何配置通道?

TSINGSEE青犀智能分析网关&#xff08;V4版&#xff09;是一款高性能、低功耗的软硬一体AI边缘计算硬件设备&#xff0c;硬件内部署了近40种AI算法模型&#xff0c;支持对接入的视频图像进行人、车、物、行为等实时检测分析&#xff0c;并上报识别结果&#xff0c;并能进行语音…

【征服redis2】redis的事务介绍

目录 目录 1.redis事务介绍 2 事务出错的处理 3.Java如何使用redis事务 1.redis事务介绍 在前面我们介绍了redis的几种典型数据结构和应用&#xff0c;本文我们来看一下redis的事务问题。事务也是数据库的重要主题&#xff0c;熟悉关系型数据库的读者应该对事务比较了解&a…

erlang (OS 操作模块)学习笔记

cmd: env: 返回所有环境变量的列表。 每个环境变量都表示为元组 {VarName&#xff0c;Value}&#xff0c;其中 VarName 是 变量和 Value 其值。 例: {VarName&#xff0c;Value} {"ERLANG_HOME","C:\\Program Files\\erl-24.3.4.2\\bin\\erl-24.3.4.2"}…

2023我的总结:读书、写作、运动、爱家人、学一门手艺

不知不觉中&#xff0c;2024年1月已过去大半了&#xff0c;按照惯例&#xff0c;还是对过去一年的所思所行做个简单的汇报。也希望我的一些经历&#xff0c;能给到正在做年终总结或新年规划的朋友&#xff0c;一些参考。 01 读书&#xff0c;是门槛最低的高贵 最近一段时间&am…

gh0st远程控制——客户端界面编写(二)

● 补充小知识&#xff1a;枚举类型的使用 每个控件&#xff08;比如列表&#xff09;都对应一个自己的唯一的变量 使用枚举类型可以将变量名与编号进行绑定&#xff0c;以后程序需要扩展的时候&#xff0c;只需要在定义枚举变量的位置重新修改编号就可以了&#xff0c;这样全…

Linux shell编程学习笔记40:stat命令

程序员必备的面试技巧 “程序员必备的面试技巧&#xff0c;就像是编写一段完美的代码一样重要。在面试战场上&#xff0c;我们需要像忍者一样灵活&#xff0c;像侦探一样聪明&#xff0c;还要像无敌铁金刚一样坚定。只有掌握了这些技巧&#xff0c;我们才能在面试的舞台上闪耀…