Redis
一、初识Redis
1、认识NoSQL
SQL | NOSQL | |
---|---|---|
数据结构 | 结构化 | 非结构化 |
数据关联 | 关联的 | 无关联的 |
查询方式 | SQL查询 | 非SQL |
事务特性 | ACID | BASE |
存储方式 | 磁盘 | 内存 |
扩展性 | 垂直 | 水平 |
使用场景 | 1)数据结构固定;2)相关业务对数据安全性、一致性要求较高 | 1)数据结构不固定;2)对一致性、安全性要求不高;3)对性能要求高 |
2、认识Redis
一个基于内存的键值型NoSQL数据库。
特征:
(1)键值型,value支持多种不同数据结构,功能丰富
(2)单线程,每个命令具备原子性
(3)低延迟,速度快(基于内存、IO多路复用、良好的编码习惯)
(4)支持数据持久化
(5)支持主从集群、分片集群
(6)支持多语言客户端
3、安装Redis
(1)redis是基于C语言编写的,因此首先需要安装redis所需要的gcc依赖
(2)Linux安装:
https://redis.io/docs/getting-started/installation/install-redis-from-source/
- 获取source file:
wget https://download.redis.io/redis-stable.tar.gz
- 解压 Compiling Redis
tar -xzvf redis-stable.tar.gz
cd redis-stable
make
- To install these binaries in /usr/local/bin, run:
make install
- 启动redis,run:
redis-server
(3)Redis的所有命令doc:
https://redis.io/commands/
二、Redis命令
redis是一个key-value型数据库,key一般是string类型,不过value的类型多种多样。
1、快速查找命令:
(1)官网:https://redis.io/commands/?group=string
(2)使用命令:
2、Redis通用命令
任何数据类型都可以使用的指令,常见的有:
help @generic
:可以查看通用命令
help [具体指令]
:可以查看一个命令的具体用法
# 查看符合模板的所有key,不建议在生产环境使用
127.0.0.1:6379> help KEYS
KEYS pattern
summary: Find all keys matching the given pattern
since: 1.0.0
group: generic
127.0.0.1:6379> help del
DEL key [key ...]
summary: Delete a key
since: 1.0.0
group: generic
127.0.0.1:6379> help exists
EXISTS key [key ...]
summary: Determine if a key exists
since: 1.0.0
group: generic
# 给key设置一个有效期,到期该key自动删除
127.0.0.1:6379> help expire
EXPIRE key seconds [NX|XX|GT|LT]
summary: Set a key's time to live in seconds
since: 1.0.0
group: generic
# 查看一个key的剩余有效期
127.0.0.1:6379> help TTL
TTL key
summary: Get the time to live for a key in seconds
since: 1.0.0
group: generic
3、String类型
(1)String类型,也就是字符串,是Redis中最简单的存储类型。
其value是字符串,不过根据字符串的格式不同,又可以分为3类:
- String:普通字符串
- int:整数类型,可以做自增、自减操作
- float:浮点类型,可以做自增、自减操作
不管是哪种格式,底层都是字节数组形式存储,只不过是编码方式不同。字符串类型的最大空间不能超过512m
(2)String类型的常见命令 SET
:添加或者修改已经存在的一个String类型的键值对GET
:根据key获取String类型的valueMSET
:批量添加多个string类型的键值对MGET
:根据多个key获取多个string类型的值INCR
:让一个整型的key自增1INCRBY
:让一个整型的key自增并指定步长。INCRBY num 2INCRBYFLOAT
:让一个浮点类型的数字自增并指定步长SETNX
:添加一个string类型的键值对,前提是key不存在,否则不执行SETEX
:添加一个string类型的键值对,并且指定有效期
4、Key的结构
Redis的key允许多个单词形成层级结构,多个单词之间用":"隔开,格式如下:
项目名:业务名:存储类型:id
5、Hash类型
Hash类型,也叫散列,其value是一个无序字典,类似于Java中的HashMap结构。
- String结构是将对象序列化为JSON字符串后存储,当需要修改对象某个字段时很不方便;
- Hash结构可以将对象中的某个字段独立存储,可以针对单个字段CRUD
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和valueHKEYS
:获取一个hash类型的key中的所有的fieldHVALS
:获取一个hash类型的key中的所有的valueHINCRBY
:让一个hash类型key的字段值自增并指定步长HSETNX
:添加一个hash类型的key的field值,前提是这个field不存在,否则不执行
6、List类型
Redis中的List类型与Java中的LinkedList类似,可以看作是一个双向链表结构。既可以支持正向检索也可以支持反向检索。
特征也与LinkedList类似:
- 有序
- 元素可以重复
- 插入和删除快
- 查询速度一般
List类型的常见命令
List的常见命令有:
LPUSH key element
:向列表左侧插入一个或多个元素LPOP key
:移除并返回列表左侧的第一个元素,没有则返回nilRPUSH key element
:向列表右侧插入一个或多个元素RPOP key
:移除并返回列表右侧的第一个元素LRANGE key star end
:返回一段角标范围内的所有元素BLPOP和BRPOP
:与LPOP和RPOP类似,只不过在没有元素时等待指定时间,而不是直接返回nil
6、Set类型
Redis的Set结构与Java中的HashSet类似,可以看做是一个value为null的HashMap。因为也是一个hash表,因此具备与HashSet类似的特征:
- 无序
- 元素不可重复
- 查找快
- 支持交集、并集、差集等功能
SET类型 常见命令
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的并集
7、SortedSet类型
Redis的SortedSet是一个可排序的set集合,与Java中的TreeSet有些类似,但底层数据结构差别很大。SortedSet中的每一个元素都带有score属性,可以基于score属性对元素排序,底层的实现是一个跳表(SkipList)加Hash表。SortedSet具备下列特性:
- 可排序
- 元素不重复
- 查询速度快
因为SortedSet的可排序特性,经常被用来实现排行榜这样的功能。
SortedSet类型的常见命令
ZADD key score member
:添加一个或多个元素到Sorted set,如果已经存在则更新其score值ZREM key member
:删除Sorted set中的一个指定元素ZSCORE key member
:获取Sorted set中的指定元素的排名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
:求差集、交集、并集
注意:所有的排名默认都是升序,如果要降序则在命令的Z后面加REV即可