【Redis】Redis基础

Redis基础

初识Redis

认识NoSQL

SQL:结构化查询语言 => 关系型数据库

NoSQL:非关系型数据库

SQL与NoSQL的差异:

  1. 数据结构
    1. SQL结构化:表的信息依赖于表的结构
    2. NoSQL非结构化:存储的信息为KV形式
  2. 数据关联
    1. SQL关联:可以建立并维护表与表之间的关系(外键)
    2. NoSQL无关联:需要自行维护数据关联
  3. 查询方式
    1. SQL:使用SQL语句查询
    2. NoSQL:没有统一标准(Redis、MongoDB)
  4. 事物特性
    1. SQL:满足ACID
    2. NoSQL:基本可用BASE
  5. 存储方式
    1. SQL:磁盘
    2. NoSQL:内存(速度快)
  6. 扩展性
    1. SQL:垂直(本机)
    2. NoSQL:水平(支持分布式)

Redis特点

  1. KV结构
  2. 单线程,命令执行具备原子性
  3. 低延迟、性能快(基于内存、IO多路复用、C语言编写)
  4. 支持数据持久化
  5. 支持主从集群(扩展速度)、分片集群(扩展存储量)
  6. 支持多语言客户端

Redis安装

Redis官方只提供了Linux版本

Redis常见命令

Redis通用命令

KEYS:查看符合模板的所有key

不建议在生产环境(或集群的主节点)上使用。Redis单线程,会导致线程阻塞。

KEYS *name*

DEL:删除key

DEL usernameDEL username password

EXISTS:判断key存在

EXISTS username

EXPIRE:给key设置有效期,单位是秒(到期自动删除)

TTL:查看有效期(-2表示不存在、-1表示永不过期)

EXPIRE name 20TTL name

Redis数据结构

  1. String
  2. Hash(类似JSON)
  3. List(列表)
  4. Set(无重复元素的集合)
  5. SortedSet(有序集合)
  6. GEO(经纬度坐标)
  7. BitMap
  8. HyperLog
String

字符串,最简单的数据类型。上限是512M。

String的类型

  • string:字符串
  • int:整型,可以自增自减
  • float:浮点类型,可以自增自减

常见命令

  1. SET:添加、修改KV
  2. GET:通过K查询V
  3. MSET:批量添加
  4. MGET:批量查询
  5. INCR:整型i++(INCR age:age++)
  6. INCRBY:整型i+=n(INCRBY age 2:age += 2)
  7. INCRBYFLOAT:浮点i+=n(INCRBYFLOAT level 2:level += 2)
  8. SETNX:新增KV(若存在K则不添加)
  9. SETEX:添加KV,并指定有效期

key的结构:层级存储。用于key名称的设置,避免了key重复的问题

项目名:业务名:类型:idhpan:user:username:1
hpan:admin:username:1
Hash

无序字典,类似JSON。

相比于序列化JSON,以字符串形式保存。Hash结构可以更方便地修改。

常见命令

  1. HSET key field value:添加、修改key的field值(HSET user:1 username wmh
  2. HGET key field:查询key的field值(HSET user:1 username
  3. HMSET、HMGET:批量
  4. HGETALL:查询所有的field和value
  5. HKEYS、HVALS:查询所有的field或value
  6. HINCRBY:整型value+=n(HINCRBY user:4 age 2:user[4].age+=2)
  7. HSETNX:新增field-value(若存在K则不添加)
List

双向链表,类似于LinkedList。可以正向、反向查找。

  1. LPUSH/RPUSH key value:左/右侧插入元素
  2. LPOP/RPOP key:左/右侧弹出元素
  3. LRANGE key i j:从i到j遍历元素
  4. BLPOP、BRPOP:阻塞式获取(有元素就取、没有元素就等)
  • 模拟栈:入口出口在同一边
  • 模拟队列:入口出口不在同一边
  • 模拟阻塞队列:入口出口不在同一边,出队使用BLPOP、BRPOP
Set

无序、元素不可重复、查找速度快、支持交集、并集、差集等。

单个Set:

  1. SADD key item…:添加item
  2. SREM key item…:移除item
  3. SCARD key:查询元素个数
  4. SISMEMBER key item:判断item是否存在
  5. SMEMBERS:获取所有元素

Set之间:

  1. SINTER k1 k2:交集
  2. SDIFF k1 k2:差集
  3. SUNION k1 k2:并集
SortedSet

每个元素都带一个score属性,根据score排序。可排序、元素不重复、查询速度快。

  1. ZADD key score item…:添加item
  2. ZREM key item…:移除item
  3. ZSCORE key item:查询item的score
  4. ZRANK key item:获取item的排名
  5. ZCARD key:查询元素个数
  6. ZCOUNT key min max:获取分数在min到max的元素个数
  7. ZRANGE key i j:获取排名为i到j的元素
  8. ZRANGEBYSCORE key min max:获取分数为min到max的元素
  9. ZINCRBY key n item:item.score+=n
  10. ZDIFF、ZINTER、ZUNION:差集交集并集

排名默认为升序,降序排名需要加上REV:ZRANK → ZREVRANK

Redis的Java客户端

客户端介绍

  1. Jedis:方法命名和Redis命令相似。线程不安全,多线程需要连接池。
  2. letture:基于Netty,支持同步、异步和响应式编程方式,线程安全。支持哨兵模式、集群模式和管道模式。
  3. Redisson:实现了分布式、可伸缩的Java数据结构。和使用原生集合一样使用Redis集合。

SpringDataRedis:整合了Jedis、letture

Jedis

redis/jedis: Redis Java client (github.com)

Jedis使用:

1、引入依赖

<dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>5.0.0</version>
</dependency>

2、建立连接

Jedis jedis = new Jedis("localhost", 6379);
jedis.auth("123.com");
jedis.set("name", "wmhs");
jedis.close();

多线程 → 使用Jedis连接池

SpringDataRedis

简介

Spring Data Redis

  • 整合Lettuce和jedis
  • 提供了RedisTemplate统一API来操作Redis
  • 支持Redis的发布订阅模型、哨兵、集群
  • 支持基于Lettuce的响应式编程
  • 支持基于JDK、JSON、宇符串、Spring对象的数据序列化及反序列化
  • 支持基于Redis的DKCollection实现

SpringDataRedis中提供了RedisTemplate工具类,其中封装了各种对Redis的操作。

不同数据类型的操作API封装到了不同的类型中

自定义RedisSerializer

RedisTemplate可以接收Object作为值写入Redis。

But,采用JDK序列化Object为字节形式。占用内存大、可读性差。

So,可以自行编写RedisSerializer实现(使用jackson)。

But,写入的对象有@class属性,造成了额外开销。

StringRedisTemplate

Spring默认提供了一个StringRedisTemplate类,KV的序列化方式默认就是String方式。

如何存对象? → 自行序列化和反序列化

常见的JSON序列化库:

  1. gson(google 的)
  2. fastjson alibaba(阿里,快但是有Bug)
  3. jackson
  4. kryo

使用步骤:

1、导入pom.xml配置

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

2、配置application.yml

spring:data:redis:port: 6379host: 127.0.0.1password: 123456database: 0timeout: 10000lettuce:pool:enabled: truemax-active: 100max-wait: 10000max-idle: 10min-idle: 1

3、编写测试类

不连接数据库启动SpringBoot项目

@SpringBootApplication(exclude= {DataSourceAutoConfiguration.class})
@Test
void StringRedisTemplateTest() {ValueOperations<String, String> ops = stringRedisTemplate.opsForValue();// nameops.set("name", "wmh");System.out.println("name: " + ops.get("name"));// yxops.set("yx", gson.toJson(new User("yx", 18)));String yx = ops.get("yx");System.out.println("yx: " + gson.fromJson(yx, User.class));
}

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

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

相关文章

Kubernetes实战(十八)-Pod亲和与反亲和调度

1 调度Pod的主要方式 Pod调度到指定Node的方式主要有4种&#xff1a; nodeName调度&#xff1a;直接在Pod的yaml编排文件中指定nodeName&#xff0c;调度到指定name的节点上。nodeSelector调度&#xff1a;直接在Pod的yaml编排文件中指定nodeSelector&#xff0c;调度到带有指…

Java和Redis实现一个简单的热搜功能

1. 前言 我们有一个简单的需求&#xff1a; 搜索栏展示当前登陆的个人用户的搜索历史记录&#xff0c;删除个人历史记录。用户在搜索栏输入某字符&#xff0c;则将该字符记录下来 以zset格式存储的redis中&#xff0c;记录该字符被搜索的个数以及当前的时间戳 &#xff08;用…

Qt5.12.0 与 VS2017 在 .pro文件转.vcxproj文件

一、参考资料 stackoverflow qt - How to generate .sln/.vcproj using qmake - Stack Overflowhttps://stackoverflow.com/questions/2339832/how-to-generate-sln-vcproj-using-qmake?answertabtrending#tab-topqt - 如何使用 qmake 生成 .sln/.vcproj - IT工具网 (coder.wo…

《WebKit 技术内幕》学习之七(2): 渲染基础

2 网页层次和RenderLayer树 2.1 层次和RenderLayer对象 前面章节介绍了网页的层次结构&#xff0c;也就是说网页是可以分层的&#xff0c;这有两点原因&#xff0c;一是为了方便网页开发者开发网页并设置网页的层次&#xff0c;二是为了WebKit处理上的便利&#xff0c;也就是…

数据库复试—关系数据库标准语言SQL

数据库复试—关系数据库标准语言SQL SQL&#xff1a;结构化查询语言 以教材中的学生-课程数据库为例进行SQL基础语法的复习 数据库实验环境选择SQLServer 11 关系模式 学生表Student(Sno,Sname,Ssex,Sage,Sdept) 课程表Course(Cno,Cname,Cpno,Ccredit) 学生选课表SC&#xf…

【Java】学习一门开发语言,从TA的Hello World开始

欢迎来到《小5讲堂》 大家好&#xff0c;我是全栈小5。 这是《Java》序列文章&#xff0c;每篇文章将以博主理解的角度展开讲解&#xff0c; 特别是针对知识点的概念进行叙说&#xff0c;大部分文章将会对这些概念进行实际例子验证&#xff0c;以此达到加深对知识点的理解和掌握…

【Android12】Android Framework系列---Adb和PMS安装apk源码流程

Adb和PMS安装apk源码流程 adb install命令 通过adb install命令可以将apk安装到Android系统&#xff08;注意&#xff1a;特定类型的apk&#xff0c;比如persist类型是无法通过adb安装的&#xff09; 下述命令中adb解析install命令&#xff0c;并调用Android PackageManagerS…

eNSP学习——部分VLAN间互通、部分VLAN间隔离、VLAN内用户隔离(MUX-VLAN)

MUX VLAN&#xff08;Multiplex VLAN&#xff09;提供了一种通过VLAN进行网络资源控制 的机制。通过MUX VLAN提供的二层流量隔离的机制可以实现企业内部员 工之间互相通信&#xff0c;而企业外来访客之间的互访是隔离的。 特点&#xff1a; 一、主VLAN端口可以和所有VLAN通信 二…

基本控件(一)

目录 控件的定义&#xff1a;使用控件的好处&#xff1a; setupUiwidget.hwidget.cppmain.cpp 控件的定义&#xff1a; QT控件是在QT框架下实现的一组用户界面元素&#xff0c;包括按钮、标签、输入框、列表框、滚动条、菜单等等&#xff0c;它们用于快速构建各种应用程序的图…

【Linux】gcc与g++的认识

gcc与g是linux下的编译器&#xff0c; 我们都知道写好了源文件gcc一下就可以得到.exe文件 那么其中会经过几个过程呢&#xff1f;也就是源文件翻译过程&#xff0c; 预处理&#xff08;预编译&#xff09;编译汇编链接 本篇文章的侧重点是围绕链接进行理解C语言标准库 目录 …

Java项目:ssm框架基于spring+springmvc+mybatis框架的民宿预订管理系统设计与实现(ssm+B/S架构+源码+数据库+毕业论文)

一、项目简介 本项目是一套ssm827基于SSM框架的民宿预订管理系统设计与实现&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Java学习者。 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调…

POI及EasyExcel学习笔记

POI及EasyExcel学习笔记 组件、工具 POI-Excel概述 Apache POI 结构&#xff1a; HSSF &#xff0d; 提供读写[Microsoft Excel](https://baike.baidu.com/item/Microsoft Excel)格式档案的功能。XSSF &#xff0d; 提供读写Microsoft Excel OOXML格式档案的功能。HWPF &am…

93. 复原 IP 地址 - 力扣(LeetCode)

题目描述 有效 IP 地址 正好由四个整数&#xff08;每个整数位于 0 到 255 之间组成&#xff0c;且不能含有前导 0&#xff09;&#xff0c;整数之间用 ‘.’ 分隔。 例如&#xff1a;“0.1.2.201” 和 “192.168.1.1” 是 有效 IP 地址&#xff0c;但是 “0.011.255.245”、“…

matlab appdesigner系列-常用16-状态按钮

状态按钮&#xff0c;有两个状态&#xff0c;按下状态&#xff0c;返回值为1或true&#xff1b;未按下状态&#xff0c;返回值为0或false 示例&#xff1a;设置一状态按钮&#xff0c;用文本记录其状态 操作步骤&#xff1a; 1&#xff09;将状态按钮、文本区域拖拽到画布上…

LeetCode 热题 100 | 哈希

目录 1 基础知识 1.1 定义哈希表 1.2 遍历哈希表 1.3 查找某一个键 1.4 插入键值对 1.5 获取键值对的值 1.6 搜索功能 2 三道题 2.1 1. 两数之和 2.2 49. 字母异位词分组 2.3 128. 最长连续序列 菜鸟做题第一周&#xff0c;语言是 C 1 基础知识 1.1 定…

对网站进行打点(不要有主动扫描行为)

什么是打点&#xff1f; 简单来说就是获取一个演习方服务器的控制权限。 目的&#xff1a; 1. 上传一个一句话木马 2. 挖到命令执行 3. 挖到反序列化漏洞 4. 钓鱼 假设对“千峰”网站进行打点&#xff1a; 1. 利用平台 1. 利用各类平台&#xff1a; 天眼查-商业查询平…

Unity SnapScrollRect 滚动 匹配 列表 整页

展示效果 原理: 当停止滑动时 判断Contet的horizontalNormalizedPosition 与子Item的缓存值 相减,并得到最小值&#xff0c;然后将Content horizontalNormalizedPosition滚动过去 使用方式&#xff1a; 直接将脚本挂到ScrollRect上 注意&#xff1a;在创建Content子物体时…

Mysql运维篇(二) 主从复制

一路走来,所有遇到的人,帮助过我的、伤害过我的都是朋友,没有一个是敌人,如有侵权请留言,我及时删除。 一、主从复制的原理 主库会生成一个I/O操作线程进去写的的操作,而从库则生成两个线程,其一是I/O读取线程,其二是一个SQL线程。 1、主库将数据的操作记录到一个二进…

C++的流库

1.流的概念 “流”&#xff0c;即“流动”的意思&#xff0c;是物质从一处向另一处流动的过程。在计算机这边通常是指对一种有序连续且具有方向性的数据的抽象描述。 C 中的流一般指两个过程的统一&#xff1a; 信息从外部输入设备&#xff08;键盘&#xff09;向计算机内部…

【数据结构与算法】之字符串系列-20240121

这里写目录标题 一、344. 反转字符串二、125. 验证回文串三、205. 同构字符串四、242. 有效的字母异位词五、290. 单词规律 一、344. 反转字符串 简单 编写一个函数&#xff0c;其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。 不要给另外的数组分配额…