文章目录
一、redis介绍
redis是一个基于内存的键值型NoSQL数据库,具有如下特征:
- 键值型,value可以执行多种不同的数据结构string、list、set、hash和zset等功能丰富。
- 单线程操作,每个命令都具有原子性
- 所谓的原子操作值的是不会被线程调度机制打断的操作,这种操作会一直运行到结束,中间不会进行线程切换。对于原子操作的理解可以分为如下两种:
- 在单线程中,能够在单条指令中完成的操作就是原子操作。中断只发生于指令之间。
- 在多线程中,不会被其他线程打断的操作就是原子操作。
- 所谓的原子操作值的是不会被线程调度机制打断的操作,这种操作会一直运行到结束,中间不会进行线程切换。对于原子操作的理解可以分为如下两种:
- 高性能,低延迟、速度快(基于内存、IO多路复用)
- 高可用,具有主从、集群和哨兵模式
- 支持java、c和python等多种语言
功能特性:
二、通用的命令
Redis命令官方地址:https://redis.io/commands,有如下通用的命令:
- help [command]
查看一个命令的具体用法
- keys *
查看库中的所有key或符合模板的所有key。
- DEL [command]:
删除一个指定的key - exists key
判断某个key是否存在。 - move key db 当前库就没有了,被移除了。
- expire key 秒钟
为给定的key设置过期时间。
- ttl key
看还当前key还有有多少秒过期,-1表示永不过期,-2表示已过期。
- type key 查看你的key是什么类型。
- select
切换数据库 - dbsize
查看当前数据库key的数量 - flushdb
清空当前库 - flushall
清空全部库 - unlink key
根据key选择非阻塞删除,仅将keys从keyspace元数据中删除,真正的删除会在后续异步操作
三、数据类型
常用的五大数据类型。
1、字符串类型(String)
(1)介绍
该类型是redis中最简单的存储形式,其value是字符串,可分为三种:
- String:普通的字符串类型
- int:整型类型,可以进行加减操作
- float: 浮点型,可以进行加减操作
(2)常用命令
- set
添加或者修键值对
- mset key value [key value …]
批量添加键值对 - get key
根据key获取value - mget key [key …]
根据多个key获取多个value
- incr
让一个整型的key自增1,相当于java中的i++ - incrby
让一个整数按照指定的步长增长 - incrbyfloat
让一个浮点类型的数字按照指定步长增长 - setnx
设置键值对,如果该key存在则不执行。
- msetnx
当key都不存在时,可以同时设置多个键值对,且该操作具有原子性,如果有一个设置失败,则都失败。
- setex
添加一个String类型的键值对,并且指定有效期 - getrange
字符串截取,类似于java中的subString操作
- setrange
- getset
(3)数据结构
String类型的数据结构为动态字符串,内不能的存储结构类型与java中的ArrayList采用预分配的方式来减少内存的频繁扩容。
2、列表(List)
(1)介绍
是一个字符串列表单键多值,它的底层是一个创建链表,对两端的操作性能很高,通过索引操作中间节点性能较差。
(2)常用命令
- lpush/rpush
从列表的左边/右边插入一个或多个值 - rpoplplush key1 key2
从key1列表右边获取一个值,并将该值从key1列表中移除,插入到key2列表左边。 - lrange key start stop
按照索引下标获取元素(从左到右) - lindex key index
按照索引下标获取元素 - lpop/rpop key
从左边/右边获取一个值,并在队列中移除该值,没有值则返回nil - linsert key before value newvalue
在value后面插入新值newvalue - lrem key n
从左边删除n个 - lset key index value
将列表key下标为index的值替换为value - llen key
获取列表的长度 - BLPOP和BRPOP
该命令会按照key的顺序查找list,直到找到第一个非空的list获取并移除该list最左边或最右边的第一个元素。此外还可以在指定的时间内获取列表中的元素,如果在指定的时间内没有元素则阻塞等待。
SpringBoot中代码应用:
public List<String> pop(List<String> keys, int timeout) {
return stringRedisTemplate.execute(connection -> {
Assert.isTrue(connection instanceof DefaultStringRedisConnection, "Connection is not DefaultStringRedisConnection!");
DefaultStringRedisConnection defConnection = (DefaultStringRedisConnection) connection;
List<String> value = defConnection.bLPop(timeout, keys);
log.info("bLPop blocked left pop, queues: {}, value: {}", keys, value);
return value;
}, true);
}
(3)数据结构
List的数据结构为快速链表,当列表元素较少的情况下使用的是连续的存储空间进行存储被称为zipList(压缩链表),当元素较多的时候会转换成quickList = 链表+zipList
3、集合(Set)
(1)介绍
该类型与java中的hashSet结构类型,底层存储结构也是hash表,与HashSet有相同的特征:
- 无序
- 元素不可重复
- 查找快
- 支持交集、并集和差集等操作
(2)常用命令
- SADD key member …
向key中添加一个或多个元素 - SREM key member …
移除key中指定的若干个元素 - SCARD key
返回key中的元素个数 - SISMBMBER key member
判断一个是否咋key中存在 - SMEMBERS key
获取key的所有元素 - SINTER key1 key2 …
求交集 - SDIFF key1 key2 ….
求差集 - SNUION key1 key2 …
求并集
(3)数据结构
底层使用的是hash表结构
4、哈希(Hash)
(1)介绍
hash是一个String类型的field(字段)和value(值)的映射表,适合用于对象存储。
(2)常用命令
-
HSET key field value
添加或者修改hash类型key的field的值
格式:
Demo:
-
HGET key field
获取一个hash类型key的field的值
格式:
Demo:
-
HMSET
添加多个hash类型key的field的值
格式
-
HMGET
批量获取多个hash类型key的field的值
格式:
Demo:
-
HGETALL
获取一个hash类型的key中的所有的field和value
格式:
- HKEYS
获取一个hash类型的key中的所有field
格式:
- HKEYS
-
HVALS
获取一个hash类型的key中的所有value
格式:
Demo:
-
HINCRBY
让一个hash类型key的字段值自增并指定步长 -
HSETNX
添加一个hash类型的key的field值,前提是这个field不存在,否则不执行
格式 :
(3)数据结构
Hash类型对应的数据结构有两种:zipList(压缩表)、hashtable(哈希表)。当field-value长度较短且个数较少时,使用ziplist,否则使用hashtable
5、有序集合(Zset)
(1)介绍
Redis的SortedSet是一个可排序的set集合,与java中的TreeSet有些类似,但底层数据结构却差别很大。SortedSet中的每一个元素都带一个score属性,可以基于score属性对元素排序,底层的实现是一个跳表(SkipList)加hash表。SortedSet具备特性:
- Redis有序集合zset与普通set非常相似,是一个没有重复元素的字符串集合
- 不同之处是有序集合的每个成员都关联了一个评分(score),这个评分(score)被用来按照从最低分到最高分的方式排序集合中的成员。集合的成员是唯一的,但是评分可以是重复的。
- 因为元素是有序的,所以你也可以很快的根据评分(score)或者次序(position)来获取一个范围的元素。
- 因为SortedSet的可排序的特性,经常被用来实现排行榜这样的功能。
(2)常用命令
-
ZADD key score member
添加一个或多个元素到sorted set,如果已经存在则更新其score值
格式:
Demo:
-
ZREM key member
删除sorted set中的一个指定元素 -
ZSCORE key member
获取sorted set中指定元素的score值 -
ZRANK key member
获取sorted set中的指定元素的排名
格式:
Demo:
-
ZCARD key
获取sorted set中的元素个数
格式:
Demo:
-
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
求差集、交集、并集
(3)数据结构
zset底层使用了两个数据结构:
- SkipList,跳跃表的目的在于给元素value排序,根据score的范围获取元素列表。
- hash,hash的作用就是关联元素value和权重score,保障元素value的唯一性,可以通过元素value找到相应的score值。
参考
- https://www.bilibili.com/video/BV1XZ4y1b74s?p=2&vd_source=cd03889ff27e1a185b3e97e3ed96d260