Redis 6基础
本片笔记适用于 b站尚硅谷 课程 Redis 6 入门到精通 超详细 教程
- 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
行式数据库
列式数据库:
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++并非是原子操作
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>
常用命令:
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的偏移量取异或,...
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内的信息返回