本片笔记适用于 b站尚硅谷 课程 Redis 6 入门到精通 超详细 教程

命令 |Redis (英语)

  • NoSQl概述
  • 行式/列式数据库(大数据时代)
  • key键操作
  • 5种基本数据类型
  • 配置文件
  • 发布与订阅
  • 3种新数据类型

Redis基础

基于K-V的高性能NoSQl数据库,提供了各种数据结构存储,具有高性能的多线功能,支持String(字符串) , list(链表) , set (集合), zset(sorted set:有序集合) 和 hash(哈希类型)

Redis支持各种方式的排序,为了保证效率,数据都是存储在缓存中的,但Redis会周期性把更新的数据写入磁盘,在此基础上实现了master-slave(主从)同步

Redis是 单线程 + 多路复用IO 技术;使用 6379端口

NoSql 数据库

NoSQL (Not Only SQL):意为“不仅仅是SQL”,泛指非关系型数据库

NoSQL 不依赖业务逻辑存储方式,而是以简单的key-value模式存储,因此增加了数据库的扩展能力

  • 不遵循SQL标准
  • 不支持ACID
  • 远超于SQL的性能

适用场景:

  • 对数据高并发读写
  • 海量数据的读写
  • 对数据高可扩展性

不适用场景

  • 需要事务支持
  • 基于sql的结构化查询存储

总之:用不着sql和用了sql也不行的情况,考虑Nosql

行式数据库

image-20220816091921656

列式数据库:

image-20220816092128015

Key键操作

keys *			//查看全部key
exists K		//查找key是否存在,返回1:存在;返回0:不存在
type K			//查看key是什么类型
del K			//删除对应K-V,返回1:成功
unlink K		//非阻塞删除对应K-V
expire K int	//为给定的K设置过期时间
ttl K			//查看还有多久数据过期(取不到)返回-1:永不过期,返回-2:已经过期

select int		//切换库
dbsize			//查看当前数据库的key数量
flushdb			//清空当前库
flushall		//通杀全部库

5种基本数据类型:

  • String(字符串)
  • List(链表)
  • Set(集合)
  • Hash(哈希)
  • Zset(有序集合)

String(字符串):

string是 二进制安全 的,意味着Redis的string可以包含任何数据,包括jpg图片或者序列化对象。

string是Redis中最基本的数据类型,一个·Redis中的value最多可以是 512M

string底层数据结构就是简单的动态字符串,结构上类似Java的ArrayList,采用预分配冗余空间的方式来减少内存的频繁分配

在字符串长度小于1M时,扩容为每次扩大一倍,大于1M时,每次扩容1M

常见命令

set K V			//设置键值对/覆盖已有的K-V键值对
get K			//取出K对应的V
append K V		//在原有K对应的V`后添加V
strlen K		//获取K对应V的长度
setnx K V		//设置键值对,如果已有K,返回0:设置失败,否则返回1:设置成功
mset K1 V1 K2 V2..	//设置一个或多个键值对
mget K1 k2..	//取出一个或多个V值
getrange K int1 int2	//获取K对应V的int1-int2部分内容:从0开始
setrange K int V	//将K对应V的int之后部分添加V再接原字符
setex K int V		//设置K-V同时设置过期时间
getset K V 		//获取旧值,同时将新值写入

// 原子操作*
incr K			//将K对应V值+1;如果V不是数字类型返回0,否则返回+1后的值
decr K			//将K对应V值-1;...否则返回-1的值
incrby K int	//将K对应V值+int;...
decrby K int	//...-int...
msetnx K1 V1 K2 V2	//同时设置多个K-V,当且仅当key都不存在
原子操作:不会被进程调度机制打断的操作,一旦开始就会运行到结束(能单条语句运行完的操作都是原子操作)

注:java中的i++并非是原子操作

image-20220816101653161

List(链表):

单键多值 ,即一个K对应多个V。底层实现是 双向链表 ,数据结构为 快速链表(quickList)即在列表元素较少时使用的结构式ziplist(压缩列表),它将所有元素挨在一起存储,分配一块连续的内存。当数据量较大时才会改为quicklist

常见命令
lpush K V1 V2...	//从左边(头节点)加入一个或多个值
rpush K V1 V2... 	//从右边(尾节点)加入一个或多个值
lrange K int1 int2  	//从左边取出int1-int2的数据(顺序):0是第一个,-1是最后一个
lpop K 		//从左边吐出一个值,值在键在,值光键亡
rpop K 		//从右边吐出一个值,...
rpoplpush K1 K2		//从K1右边取出值加到K2左边
lindex K int 	//按照索引下标获得元素
llen K		//获得列表长度

linsert K before V1 V2 		//在V1前添加一个V2
linsert K after V1 V2	 	//在V1后添加一个V2
lrem K int V		//从左边删除int个V
lset K int V		//将列表K下标为int的值替换为V

Set(集合):

set可以 自动排重 ,且提供了判断某个成员是否在一个set集合的接口。

Redis的set是String类型的无序集合,底层是一个value为null的hash表,所以添加,删除,查找复杂度都是O(1)

常用命令
sadd K V1 V2...		//将一个或多个members元素添加至key中,已存在的会被忽略
smembers K		//取出该集合的所有值
sismember K V		//判断K集合中是否右V值,有返回1,否则返回0
scard K		//返回集合元素个数
srem K V1 V2		//删除集合中的一个或多个元素
spop K		//随机从集合中取出一个值,值完键亡
srandmember	K int		//随机取出int个值,不会在集合中删除
smove K1 K2 V1 V2...	//将K1中元素V1,v2..移动到K2中,返回移动元素个数
sinter K1 K2		//返回两个集合的交集元素
sunion K1 K2		//返回两个集合的并集元素
sdiff K1 K2			//返回两个集合的差集元素(在K1而不在K2)

Hash(哈希):

Redis Hash是一个键值对集合,其value对应一个String类型的field和value映射表,适合用于存储对象,类似Java中的Map<String, Object>

image-20220816150802600

常用命令:
hset K field value		//在K中添加一个field-value对
hget K field		//返回K中field对应的值
hmset K f1 v1 f2 v2		//在K中批量设置field-value对
hexists K field		//查看中是否存在field
hkeys K			//列出K集合中全部的field
hvals K			//列出K集合中全部的value
hincrby K field int 	//给K中的field对应value值
hsetnx K field value	//为K添加field-value对,如果field原本存在则不会添加

Zset(有序集合):

Zset与set相同,是 没有重复元素 的字符串集合。不同之处是Zset每个成员都关联了一个评分(score),score用于按照从低到高的方式对集合成员进行排序。

集合成员是唯一的,但评分可以重复

常用命令:
zadd K score1 v1 s2 v2		//添加一个或多个评分-值
zrange K int1 int2 		//返回排序从int1到int2的值
zrange K int1 int2 withscores 		//返回排序从int1到int2的值,同时返回评分
zrangebyscore K int1 int2			//返回score在int1至int2中间的值,可以加withscores
zrevrangebyscore K int1 int2		//逆序返回score在int1至int2中间的值,可以加with...
zincrby K int V			//给K中V的score增加int
zrem K V			//删除指定值
zcount K int1 int2		//统计集合中在int1-int2中的元素个数
zrank K V		//返回该值在集合中的排名,从0开始

配置文件:

配置文件:redis.conf

vi /etc/redis.conf

bind 127.0.0.1		#限制仅本地连接
protected-mode yes	#仅本地访问,改为no即可允许非本地访问
port:6379			#端口
tcp-backlog 511		#目前已经完成三次握手以及正在三次握手的队列
timeout	0			#超时时限,设为0则永不超时
tcp-keepalive 300	#心跳监测连接,每隔300s检查一次
daemonize yes		#允许后台启动
pidfile	...			#保存进程号的位子
loglevel notice		#log保护级别:debug>verbose>notice>warning
logfile ""			#日志输出路径,默认为空
database 16			#redis默认16个数据库,用户默认使用0号库

#密码requirepass与客户端LIMITS

maxmemory 10000		#最大内存
maxmemory-sample 5	#样本数量
maxclients 10000	#最大连接数

#持久化设置

发布与订阅:

# /usr/local/bin/redis-cli
SUBSCRIBE channel1		#订阅channel1频道
publicsh  channels hello	#使channel1发布消息“hello”

一种消息的沟通模式:频道收到消息后,所有订阅的对象都会收到对应消息

3种新数据类型:

Bitmaps:

BitMaps本身就是字符串Key-Value,但是可以对字符串进行位运算,可以把Bitmaps想象为一个以位为单位的数组,数组只能存储0和1,数组下标在BotMaps中被成为偏移量,最左边为0.

常用命令:
setbit K int1 int2		#对K中int1号位子上改为int2(0/1)
getbit K int		#获取K中偏移量int中的值
bitcount K			#统计K中被设为1的数量
bitcount K int1 int2 	#统计K中int1到int2之间1的数量
bitop and K1 K2			#对K1,K2中为1的偏移量取与集,返回统计值
bitop or K1 K2			#对K1,K2中为1的偏移量取并集,...
bitop not K1 K2			#对K1,K2中为1的偏移量取差集,...
bitop xor K1 K2			#对K1,K2中为1的偏移量取异或,...

image-20220817090407369

HyperLogLog:

HyperLogLog只会根据输入元素计算*基数,不会存储输入元素本身

基数:集合中不重复元素的总值被称为基数,如{1,6,3,4,3,9},不重复元素为1,3,4,6,9 基数为5

常用命令
pfadd K V1 V2		#添加一个或多个元素
pfcount K		#统计基数
pfmerge K1 K2 K3	#将K2,K3中的值全部合并至K1

Geospatial:

GEO:Geographic地理位置信息的缩写,提供了经纬度设置,查询,范围查询,距离查询,经纬度Hash等操作

有效范围:经度:-180——180;纬度:-85——85

常用命令
geoadd K int1 int2 V  	#设置K中的V:经度为int1,纬度为int2
geopos K V		#获取K中V的经纬度
geodist K V1 V2	m	#获取V1到V2的直线距离,以米做单位(km千米,mi英里,ft英尺)
georadius K int1 int2 int3 km		#对K中处于经度int1纬度int2方圆int3km内的信息返回