【redis笔记】redis基础数据类型及其命令

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底层是单线程+IO多路复用

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,'\0’等,是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底层数据结构

底层实现是用hash表做的字典。

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范围获取元素列表

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值