Redis学习笔记
简介
NoSQL
- NoSQL:非关系型数据库
- 特征:
- 非结构化:数据约束松散,如键值型/文档型/列类型/图型
- 无关联:不维护表之间的关联
- 非SQL:没有固定统一的语法格式
- BASE:无法满足ACID
- 存储在内存中,性能较高
- 支持水平扩展
- 适用场景:
- 数据结构不固定
- 对一致性、安全性要求不高
- 对性能要求高
Redis
- Redis:全称 Remote Dictionary Server (远程辞典服务器),是一个基于内存的键值型NoSQL数据库
- 特征:
- 键值型,
value支持多种不同的数据结构,功能丰富 - 单线程,每个命令具备原子性
- 低延迟,速度快(基于内存、IO多路复用、良好的编码)
- 支持数据持久化
- 支持主从集群、分片集群
- 支持多语言客户端
- 键值型,
初次使用
安装与配置
笔者使用的是 Arch Linux 操作系统,因此仅对此说明
- 安装
sudo pacman -S redis
- 服务启动
sudo systemctl start redis
- 服务开机启动
sudo systemctl enable redis
- 查看服务状态
sudo systemctl status redis
- 配置文件
配置文件地址:/etc/redis/redis.conf
# 修改监听地址:将下面这行注释掉,添加自己需要的ip
bind 127.0.0.1 -::1
# 设置访问密码
requirepass 123456
# 监听端口
port 6379
# 最大内存占用
maxmemory 512mb
# 日志文件
logfile "redis.log"
命令行客户端
开启 Redis 命令行客户端的命令:
redis-cli [options] [commands]
一般来说,使用如下命令启动客户端:
redis-cli -p 6379
启动客户端后,需要输入登录信息:
AUTH wxy3265 123456
如果未设置用户名,只需输入密码:
AUTH 123456
检查连接:
ping
若输出为 PONG ,说明连接成功
Key 的层级结构
Redis 的 key 允许有多个单词形成层级结构,多个单词之间用 : 隔开,格式:项目名:业务名:类型:id
该格式并非固定,可以根据自己的需求修改,如:
eastwood:student:1
eastwood:classes:1
如果 value 是一个 Java 对象,例如一个 User 对象,则可以将对象序列化为 JSON 字符串后存储:
| key | value |
|---|---|
| eastwood:student :1 | {“id”:1, “name”:“steve”, “score”: “85”} |
| eastwood:classes:1 | {“id”: 1, “name”:“ClassA”} |
命令与数据结构
官方文档:https://redis.io/commands
通用命令
help [command]:查看一个命令的用法KEYS
说明:查看符合模板的所有 key (可使用通配符模糊查询)。效率较低,不建议在生产环境设备上使用
例:KEYS *DEL
说明:删除一个或多个指定的 KEY 。如果包含不存在的 key ,则只删除存在的部分,返回删除的条数。
例:DEL k1 k2 k3EXISTS
说明:判断 key 是否存在
例:EXIST kEXPIRE
说明:给一个 key 设置有效期,有效期到期时该 key 会被自动删除
例:EXPIRE k 10TTL
说明:查看一个 key 的剩余有效期,永久数据返回-1,数据不存在返回-2
例:TTL k
String
介绍
String:字符串类型,是 Redis 中最简单的存储类型。- 类型:
string:普通字符串int:整数类型,可以做自增、自减操作float:浮点类型,可以做自增、自减操作
- 无论类型,底层均为字节数组存储,但编码方式不同
- 字符串类型的最大空间不能超过512MB
常见命令
SET:添加或修改已经存在的一个String类型的键值对GET:根据key获取String类型的valueMSET:批量添加多个String类型的键值对MGET:根据多个key获取多个String类型的valueINCR:让一个整型的key自增1INCRBY:让一个整型的key自增并指定步长,如INCRBY num 2为让num自增 2INCRBYFLOAT:让一个浮点类型的数字自增并指定步长SETNX:添加一个String类型的键值对,前提是这个key不存在,否则不执行SETEX:添加一个String类型的键值对,并且指定有效期
Hash
介绍
Hash的value是一个无序字典,类似于 Java 中的HashMap结构。Hash结构可以将对象中的每个字段独立存储,可以针对单个字段做 CRUD
常见命令
HSET key field value:添加或修改hash类型key的 fi`eld 的值HGET key field:获取一个hash类型的key的field的值HMSET:批量添加HMGET:批量获取HGETALL:获取一个hash类型的key中的所有的field和valueHKEYS:获取一个hash类型的key中的所有fieldHVALS:获取一个hash类型的key中的所有valueHINCRBY:让一个hash类型key的字段值自增并指定步长HSETNX:添加一个hash类型的key的field值,前提是这个field不存在,否则不执行
List
介绍
- List 与 Java 中的 LinkedList 类似,可以看作是一个双向链表结构。既可以支持正向检索也可以支持反向检索。
- 特征
- 有序
- 元素可以重复
- 插入和删除快
- 查询速度一般
- 常用于保存对顺序有要求的数据,如点赞、评论
常见命令
LPUSH key element ...:向列表左侧插入一个或多个元素LPOP key:移除并返回列表左侧的第一个元素,没有则返回nilRPUSH key element:向列表右侧插入一个或多个元素RPOP key:移除并返回列表右侧的第一个元素LRANGE key star end:返回一段角标范围内的所有元素BLPOP和BRPOP:与LPOP和RPOP类似,但在没有元素时等待指定时间,而不是直接返回nil
Set
介绍
Set与 Java 中的HashSet类似,可以看作一个value为null的HashMap。因为也是一个hash表,因此具备与HashSet类似的特征:- 无序
- 元素不可重复
- 查找快
- 支持交集、并集、差集等功能
常见命令
SADD key member ...:向set中添加一个或多个元素SREM key member ...:移除set中的指定元素SCARD key:返回set中元素的个数SISMEMBER key member:判断一个元素是否存在于set中,返回 1/0SMEMBERS:获取set中的所有元素SINTER key1 key2 ...:求key1与key2的交集SDIFF key1 key2 ...:求key1与key2的差集SUNION key1 key2 ...:求key1与key2的并集
SortedSet
介绍
SortedSet是一个可排序的set集合,与 Java 中的TreeSet有些类似,但底层数据结构却差别很大。SortedSet中的每一个元素都带有一个score属性,可以基于score属性对元素排序,底层的实现是一个跳表(SkipList) 加hash表。- 特性
- 可排序
- 元素不重复
- 查询速度快
- 因为其可排序特性,常用于实现排行榜这样的功能。
常见命令
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 排序后,获取指定 score 范围内的元素ZDIFF、ZINTER、ZUNION:求差集、交集、并集