一、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)
5、有序集合(Zset)