Nosql与redis简介
redis是一种NoSql,是一种非关系型数据库,以K-V的方式存储数据,不依赖于业务逻辑,不支持ACID,不遵循SQL标准,性能上远超关系型数据库,适用于高并发的场景及海量数据读写,对数据具有高扩展性。常见的NoSql数据库有:
- memcache 数据都在内存中,不支持持久化,支持简单的kv模式,类型比较单一,一般作为缓存数据库辅助持久化数据库。
- redis 数据都在内存中,支持持久化,持久化主要用来做备份恢复,除了k–v模式,还支持多种数据类型,如string,set,hash,zset等,一般也是用作缓存数据库辅助持久化数据库。
- mongoDb 高性能、开源、模式自由的文档型数据库,数据都存在内存中,如果内存不足,保存到硬盘,虽然也是kv模式,但对value提供了丰富的查询功能。支持二进制数据及大型对象,可以根据数据的特点替代RDBMS,成为独立数据库,或者配合RDBMS,存储特定数据。
redis常识
- redis默认端口号6379,默认16个数据库,默认使用0号库
- 可以使用select + dbid来切换数据库,如select 8
- 所有库的密码都一样
- dbsize命令可以查看当前数据库中key的数量
- flushdb用于清空当前数据库
- flushall清空所有数据库
redis key操作
- keys * 查看当前库中有哪些库
- set key value 设置key 的value值
- exists key 判断key是否存在,返回int 1或0
- type key 查看key的类型(string/hash/zset等)
- del key 删除key
- unlink key 删除key,非阻塞删除,执行命令时返回,真正删除在后续操作
- expire key 30 设置key的过期时间为30秒(时间以秒为单位)
- ttl key 查看key还有多少秒过期,-1表示永不过期,-2表示已经过期了
- select + db_index 切换数据库
- dbsize 查看有多少个key
redis 数据类型
string 类型
二进制安全类型,可以包含任何数据,n,’’等,是redis中最基本的数据类型,redis中一个string类型value最大可以有512MB
string 类型支持的操作有下面这些内容:
set k1 zxcvbn 设置k1值zxcvbn,多次set同一个key会进行覆盖
get k1 获得k1的值
append k1 a 在库k1对应的值尾部添加a,成功后返回value总长度
strlen k1 获得k1对应值的长度
setnx k1 v1 当库k1不存在时设置值,存在时不覆盖返回0
incr k2 当值为数字类型时,可以给k2所对应的值进行+1
decr k2 当值为数字类型时,可以给k2所对应的值进行-1
incrby k2 10 给k2所对应的值加上自定义步长10
decrby k2 10 减10
incr的操作是原子的
mset k1 v1 k2 v2 …同时设置多个键值对
mget k1 k2 … 同时获得多个键值对
msetnx k1 v1 k2 v2 … 也是同时设置多个值,如果其中有一个以上key存在,会失败,所有key不存在时才会成功,是一个原子性的操作
getrange k1 start_pos end_pos 获取k1指定起始和终点位置的下标,如假如k1值为myredis,getrange k1 1 2 返回yr,是一个左右都闭合的区间,下标从0开始。
setrange k1 pos abc 将abc插入到k1对应的值中,从值的第pos个位置开始,如set k1 2 abc,会返回myrabcedis
setex key expire_time value 设置key的值为value并且过期时间为expiretime
getset key value 获取key的值并用新的value替换原值
redis string 底层数据结构
string类型是一种简单字符串,会进行动态扩容,会提前预分配空间以减少内存分配,字符串的实际分配空间一般都会高于实际字符串的长度,当字符串长度小于1M时,会加倍扩容,大于1M时,扩容只会多扩1M的内存。
redis list类型
redis list是单键多值的一种数据结构,一个key可以对应一整个列表的值,列表是双向列表,是插入有序的,可以选择头插或尾插(左右插值),双端操作性能较高,列表中部操作性能较差
list类型常用命令
lpush/rpush k1 v1 v2 v3 往k1中坐插/右插入一个或多个值
lrange k1 start end 获取k1中start 到end下标对应的值内容(从左到右),如果是坐插,那么会获得v3,v2,v1,rpush则会获得v1,v2,v3
lrange k1 start -1表示获取start之后所有的值
lpop/rpop k1 从左边或右边取出来一个值,如果值全取出来了,key也就不存在了
rpoplpush k1 k2 从k1的链表右边取一个值插入到k2的左边
index key index 根据索引下标取到对应元素
len key 获取列表长度
linsert k1 before/after value new_value 往k1所对应链表中value值前面/后面插入new_value值
lrem key n value 从左边开始删除n个value
lset key index value 将key链表下标index的值替换成value
list底层数据结构
redis底层实现为quicklist,在元素较少时,会使用一块连续的内存,使用ziplist,它把所有元素紧挨着一起存储,数据量较多时才使用quicklist,元素多的时候是将多个压缩链表用链表串起来,做到了快速的插入删除和减少空间冗余。
redis set类型
redis的set是自动去重的,并且是无序的,是一个无序的string集合。底层是一个value为null的hash表,添加、删除、查找的复杂度为O(1)。
set常用命令
sadd k1 v1 v2 v3往集合k1中插入v1,v2v3,如果是重复的value将被忽略。
smembers k1 取出k1集合中所有元素
sismember k1 v1 判断v1是否在库k1集合中,在返回1,不在返回0
scard k1 查看k1集合中元素个数
srem k1 v1 v2 … 删除集合中的元素v1,v2,返回删除的个数
spop k1 随机从集合k1中吐出一个值
srandmember k1 n 随机从集合k1中去除n个值,不会删除值
smove source dest value 把集合source中的value移动到dest集合
sinter k1 k2 取两个集合的交集
sunion k1 k2 取两个集合的并集
sdiff k1 k2 取两个集合的差集,实际上也可以sdiff k1 k2 k3,但是按顺序来做diff的,返回的是在k1中,不在k2(及k3)中的元素,如果没有返回空
set底层数据结构
redis hash类型
redishash 是一个键值对集合。这个hash表是一个string类型的field和value映射表。适用于存储对象。
hash常用命令
hset key field value 给集合key 中插入一个以field为key,value为值的对象
hget key field 从集合key中获取field对应的值
hmset key field1 v1 field2 v2 … 一次批量设置hash值
hexists key field 查看key集合中,field是否存在
hkeys key 列出key集合所有的field
hvals key 列出key集合所有field对应的值
hincrby key field n 给集合key的filed所对应的值加上n
hsetnx key field value 给集合key添加一对kv对,当且仅当不存在field
redis有序集合zset
zset也是一个没有重复元素的字符串集合,集合每个元素包含了一个分值,根据分值进行排序,元素的key不能重复,但分值是可以有相等的分值存在
zset常用命令
zadd k1 score1 value1 score2 value2 … 往集合中添加元素
zrange k1 start end 取出下标start到end的元素,不包含score,如果想要连score一起取出来,在后面添加withscores
zrangebyscore k1 minmax [withscores] [limit offset count] 取出由我们限定的最小到最大范围之间的元素
zrevrangescore k1 max min [withscores] [limit offset count] 按max到min的顺序,取出在其之间的元素
zincrby k1 50 member 给指定member成员的score加上50
zcount k1 200 300 统计k1集合中200 – 300的score之间有多少个元素
zrem k1 value 删除k1集合中给定值的元素
zrank k1 value 查看指定value的排序位置,下标都是从0开始
zset底层实现
(1)使用hash关联了元素及其score,元素名称作为field,元素score作为值;
(2)使用跳表给元素value排序,根据score范围获取元素列表
原文地址:https://blog.csdn.net/qq_42936727/article/details/134762012
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_45488.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!