Redis 笔记

本文介绍了Redis的基本概念,包括其作为内存数据库的特性、NoSQL与SQL的对比、安装方法、多线程架构、数据持久化、集群功能以及常用的数据结构和命令。此外,还提到了Redis客户端的选择及其在SpringDataRedis中的应用。
摘要由CSDN通过智能技术生成


一、Redis 入门

Redis 介绍
是什么?
●基于内存的 K / V 存储中间件
●NoSQL 键值对数据库

Redis 不仅仅是数据库,它还能作为消息队列等等。
 

VALUE

KEY

ID

1001

张三

NAME

21

AGE

J

"ID":1001,

"NAME":"张三",

1001

"AGE": 21

键值数据库

image.png



关系型 SQL 和 NoSQL 的对比
其中应用场景是关键:
 

认识NOSQL

SQL

NOSQL

#1 键值类型(REDIS)

结构化(STRUCTURED)

非结构化

数据结构

#2 文档类型(MONGODB)

无关联的

关联的(RELATIONAL)

#3 列类型(HBASE)

数据关联

#4 GRAPH类型(NEO4J)

非SQL

查询方式

SQL查询

事务特性

BASE

ACID

存储方式

磁盘

内存

扩展性

水平

垂直

1)数据结构不固定

1)数据结构固定

使用场景

2)对一致性,安全性要求不高

2)相关业务对数据安全性,

3)对性能要求

一致性要求较高

image.png



Redis 特征


1支持多种数据结构
2单线程,每个命令的执行具备原子性,中途不会执行其他命令(指命令处理始终是单线程的,自 6.x 起改为多线程接受网络请求)
3高性能、低延时(基于内存、IO 多路复用、良好编码)
4支持数据持久化
5支持主从、分片集群
6支持多语言客户端



Redis 安装


建议 Linux 下安装,直接到官网安装即可,注意安装后更改 redis.conf 文件,设置 bind ip、requirepass 密码等参数。

Redis 连接方式
●redis-cli
●GUI
●多语言 SDK



Redis 常用命令


Redis 的命令根据数据结构分为多个组。
不用背!忘了就查:
1)redis 官网命令集:Commands | Redis,中文版:Redis命令中心(Redis commands) -- Redis中国用户组(CRUG)

查看通用的命令

image.png



通用命令


●set key value
●get key
●keys pattern 模糊搜索多个 key。性能较差,生产环境(尤其是主节点)不建议使用
●del key...
●exists key 判断 key 是否存在
●expire key 设置过期时间
●ttl key 查询剩余存活时间,未设置过期时间则为 -1

Redis 基本数据结构
String 类型
支持存储字符串、数字、浮点数(实际存储都是字节数组):

VALUE

KEY

HELLO WORLD

MSG

10

NUM

92.5

SCORE

image.png



单 key 的 value 最大不能超过 512 M!
 

STRING类型的常见命令

STRING的常见命令有:

SET:添加或者修改已经存在的一个STRING类型的键值对

GET:根据KEY获取STRING类型的VALUE

MSET:批量添加多个STRING类型的键值对

MGET:根据多个KEY获取多个STRING类型的VALUE

INCR:让一个整型的KEY自增1

INCRBY:让一个整型的KEY自增并指定步长,例如:INCRBYNUM2让NUM值自增2

INCRBYFLOAT:让一个浮点类型的数字自增并指定步长

SETNX:添加一个STRING类型的键值对,前提是这个KEY不存在,否则不执行

SETEX:添加一个STRING类型的键值对,并且指定有效期

image.png



实际使用时,通常用冒号连接多个词来拼接 key,比如 [项目名]:[业务名]:[类名]:[id]。在某些 GUI 工具中,会自动根据冒号来划分层级,浏览更方便。



Hash 类型


值是一个 Hash 结构(类似 Java 的 HashMap):

HASH结构可以将对象中的每个字段独立存储,可以针对单个字段做CRUD:

VALUE

KEY

FIELD

VALUE

JACK

NAME

HEIMA:USER:1

21

AGE

ROSE

NAME

HEIMA:USER:2

18

AGE

image.png



常用命令:


其实就是在 String 命令名的基础上增加了 'H' 首字母

HASH类型的常见命令

HASH的常见命令有:

HSET KEY FIELD VALUE:添加或者修改HASH类型KEY的FIELD的值

HGET KEY FIELD:获取一个HASH类型KEY的FIELD的值

HMSET:批量添加多个HASH类型KEY的FIELD的值

HMGET:批量获取多个HASH类型KEY的FIELD的值

HGETALL:获取一个HASH类型的KEY中的所有的FIELD和VALUE

HKEYS:获取一个HASH类型的KEY中的所有的FIELD

HVALS:获取一个HASH类型的KEY中的所有的VALUE

HINCRBY:让一个HASH类型KEY的字段值自增并指定步长

HSETNX:添加一个HASH类型的KEY的FIELD值,前提是这个FIELD不存在,否则不执行

image.png



List 类型


理解为 Java 的 LinkedList 双向链表,特点是有序、插入删除快、但查找性能一般:
常见命令如下:
有点像操作一个双端队列

LIST类型的常见命令

LIST的常见命令有:

LPUSH KEY ELEMENT...向列表左侧插入一个或多个元素

LPOPKEY:移除并返回列表左侧的第一个元素,没有则返回NIL

RPUSH KEY ELEMENT...向列表右侧插入一个或多个元素

RPOP KEY:移除并返回列表右侧的第一个元素

LRANGE KEY STAR END:返回一段角标范围内的所有元素

BLPOP和BRPOP:与LPOP和RPOP类似,只不过在没有元素时等待指定时间,而不是直接返回NIL

RPUSH

LPUSH

LPOP

RPOP

LRANGE KEY 1, 2

image.png



Set 类型


集合,类似于 Java 中的 HashSet,特点是单 set 内元素不能重复、查找性能高。
常见命令如下:
分为单集合命令和多集合命令(交并差集)

SET类型的常见命令

STRING的常见命令有:

SADDKEYMEMBER....向SET中添加一个或多个元素

S1

SREM KEY MEMBER...移除SET中的指定元素

S1 DIFF

S2

SCARD KEY:返回SET中元素的个数

SISMEMBERKEY MEMBER:判断一个元素是否存在于SET中

SMEMBERS:获取SET中的所有元素

B

INTER

SINTERKEY1KEY2...:求KEY1与KEY2的交集

SDIFFKEY1KEY2...:求KEY1与KEY2的差集

SUNION KEY1 KEY2.:求KEY1和KEY2的并集

S2

image.png



SortedSet 类型


有序集合,在 set 的基础上给每个元素多存了一个分数,类似于 value 类型为整型的 HashMap。
特点是有序、查找性能高,适合用于排行榜、统计 TopN。
常见命令:
和 set 结构的命令很像

SORTEDSET类型的常见命令

SORTEDSET的常见命令有:

ZADDKEY SCOREMBER:添加一个或多个元素到SORTED SET, 如果已经存在则更新其SCORE值

ZREM KEY MEMBER:删除SORTED SET中的一个指定元素

ZSCORE KEY MEMBER:获取SORTED SET中的指定元素的SCORE值

ZRANK KEY MEMBER:获取SORTED SET 中的指定元素的排名

ZCARD KEY:获取SORTED SET中的元素个数

ZCOUNTKEYMIN MAX:统计SCORE值在给定范围内的所有元素的个数

ZINCRBYKEYINCREMENTMEMBER:让SORTED SET中的指定元素自增,步长为指定的INCREMENT值

ZRANGEKEYMIN MAX:按照SCORE排序后,获取指定排名范围内的元素

ZRANGEBYSCOREKEYMIN MAX:按照SCORE排序后,获取指定SCORE范围内的元素

ZDIFF,ZINTER,ZUNION:求差集,交集,并集

注意:所有的排名默认都是升序,如果要降序则在命令的乙后面添加REV即可

image.png



Redis 客户端


主流客户端
可以在 Redis 官网查看所有客户端以及推荐的客户端:Get started using Redis clients | Redis
对于 Java,主要推荐以下 3 种:

JAVA

Y OTHER

A JDBC CLIENT FOR REDIS.

JDBC-REDIS

Y OTHER

JREDIS

A REDIS CLIENT.

P OTHER

A BLAZINGLY SMALL AND SANE REDIS JAVA

JEDIS

CLIENT

A JAVA CLIENT THAT PROVIDES CONNECTION

RJC

OTHER

POOLING IN APACHE DBCP STYLE,SHARDING,

PIPELINES,TRANSACTIONS AND MESSAGES.

I

REDISSON

DISTRIBUTED AND SCALABLE JAVA DATA

OTHER

STRUCTURES ON TOP OF REDIS SERVER

OTHER

ASYNCHRONOUS,PIPELINED CLIENT BASED ON

AREDIS

THE JAVA 7 NIO CHANNEL API

Y OTHER

A VERY SIMPLE YET VERY COMPLETE JAVA

JAVA-REDIS-CLIENT

CLIENT IN LESS THAN 200 LINES WITH O

DEPENDENCIES.

ADVANCED REDIS CLIENT FOR THREAD-SAFE

OTHER

LETTUCE

SYNC,ASYNC,AND REACTIVE USAGE.

SUPPORTS CLUSTER,SENTINEL,PIPELINING,AND

CODECS.

image.png



其中,Jedis 的命令和原生 redis 命令行的命令一致,学习成本最低(注意它是线程不安全的,通常配合连接池使用);Lettuce 和 Spring 兼容最好(Spring Data Redis 默认集成)、基于 Netty 性能最高;Redisson 提供了和 Java 集合用法一致的分布式集合,适用于更复杂的业务场景。

Spring Data Redis
Spring Data 整合封装了一系列数据访问的操作,Spring Data Redis 则是封装了对 Jedis、Lettuce 这两个 Redis 客户端的操作,提供了统一的 RedisTemplate 来操作 Redis。
RedisTemplate 针对不同的 Redis 数据结构提供了不同的 API,划分更明确:

返回值类型

说明

API

操作STRING类型数据

REDISTEMPLATE.OPSFORVALUE()

VALUEOPERATIONS

操作HASH类型数据

REDISTEMPLATE.OPSFORHASH()

HASHOPERATIONS

操作LIST类型数据

REDISTEMPLATE.OPSFORLIST()

LISTOPERATIONS

操作SET类型数据

REDISTEMPLATE.OPSFORSET()

SETOPERATIONS

操作SORTEDSET类型数据

REDISTEMPLATE.OPSFORZSET()

ZSETOPERATIONS

通用的命令

REDISTEMPLATE

image.png



注意,要在 Spring Data Redis 中使用 Lettuce 线程池的话,要额外引入 apache commons-pool2 依赖。

RedisTemplate 序列化
RedisTemplate 默认使用 JDK 原生序列化器,可读性差、内存占用大,因此可以用以下两种方式来改变序列化机制:
1自定义 RedisTemplate,指定 key 和 value 的序列化器
2使用自带的 StringRedisTemplate,key 和 value 都默认使用 String 序列化器,仅支持写入 String 类型的 key 和 value。因此需要自己将对象序列化成 String 来写入 Redis,从 Redis 读出数据时也要手动反序列化。

1

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值