当前位置: 首页 > news >正文

【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));
}

相关文章:

  • STM32标准库开发——PWM驱动代码
  • SpringMVC获取参数与页面跳转
  • C++ vector 数组转换、查找、最大最小值、排序、排行的几种用法
  • C++ 知识列表【图】
  • 【Linux对磁盘进行清理、重建、配置文件系统和挂载,进行系统存储管理调整存储结构】
  • Docker是什么
  • 开源图床LightPicture搭建本地图片管理系统并实现无公网IP远程访问
  • 【Linux】权限 !
  • 数据库安全-第一章 Mysql 安全基础-【web 环境搭建——LAMP-1】-LAMP LNMP 简介
  • wamp环境的组成
  • Linux_清理docker磁盘占用
  • list列表可编辑状态
  • element的el-autocomplete组件的使用(模糊匹配、自定义模板、远程搜索)
  • axios原理
  • JVM的组成部分(类加载器、运行时数据区、执行引擎、本地库接口)
  • (十五)java多线程之并发集合ArrayBlockingQueue
  • [分享]iOS开发-关于在xcode中引用文件夹右边出现问号的解决办法
  • C语言笔记(第一章:C语言编程)
  • HTML-表单
  • Javascript弹出层-初探
  • Java程序员幽默爆笑锦集
  • Lucene解析 - 基本概念
  • MySQL用户中的%到底包不包括localhost?
  • Storybook 5.0正式发布:有史以来变化最大的版本\n
  • windows下使用nginx调试简介
  • XForms - 更强大的Form
  • 阿里云Kubernetes容器服务上体验Knative
  • 解析带emoji和链接的聊天系统消息
  • 前端技术周刊 2019-02-11 Serverless
  • 设计模式(12)迭代器模式(讲解+应用)
  • 一些基于React、Vue、Node.js、MongoDB技术栈的实践项目
  • ​3ds Max插件CG MAGIC图形板块为您提升线条效率!
  • # 计算机视觉入门
  • (173)FPGA约束:单周期时序分析或默认时序分析
  • (JSP)EL——优化登录界面,获取对象,获取数据
  • (pojstep1.1.2)2654(直叙式模拟)
  • (阿里云万网)-域名注册购买实名流程
  • (二)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (六)Hibernate的二级缓存
  • (四)搭建容器云管理平台笔记—安装ETCD(不使用证书)
  • (五)MySQL的备份及恢复
  • (新)网络工程师考点串讲与真题详解
  • (原)记一次CentOS7 磁盘空间大小异常的解决过程
  • (转)chrome浏览器收藏夹(书签)的导出与导入
  • **PyTorch月学习计划 - 第一周;第6-7天: 自动梯度(Autograd)**
  • @Autowired标签与 @Resource标签 的区别
  • [120_移动开发Android]008_android开发之Pull操作xml文件
  • [Ariticle] 厚黑之道 一 小狐狸听故事
  • [emacs] CUA的矩形块操作很给力啊
  • [LeetCode] Binary Tree Preorder Traversal 二叉树的先序遍历
  • [LeetCode刷题笔记]1 - 两数之和(哈希表)
  • [Linux打怪升级之路]-vim编辑器(看就能马上操作噢)
  • [NKCTF 2024]web解析
  • [Python]`threading.local`创建线程本地数据
  • [Qt桌面开发]一个Qt简单界面的开发