写在前面
各位看官老爷如果本篇文章对你有帮助就给个赞赞赞赞赞吧
Redis基本数据结构
String
、list
、set
、hash
、zset
,本篇文章我们主要根据这五种基本数据结构的使用来展开当然还有,使用Redis之前我们要知道Redis本身是一个NoSQL数据库,数据一般都用key-value
(键值对)来存储
启动redis
切换到redis安装目录下,输入下面语句,就可以启动redis了,也可以设置为开机自动启动
redis-server.exe redis.windows.conf
启动了redis后,若想操作redis呢?就要新打开一个cmd窗口,win+R
输入cmd
,切换到redis目录下,输入下面这条语句
redis-cli.exe -h 127.0.0.1 -p 6379
出现下面这个界面则启动成功
String(字符串)
Redis的String几乎是我们最常使用的,底层数据结构可以看看我这篇文章 String底层详解(sds简单动态字符串)
1.set key value
设置指定key的value
set key(key的名称) value(值)
示例:设置key:name的value:aliang
2.get key
查询指定key的value
get key(key的名称)
示例:查询key:name的值
3.getset key value
查询出某个key的值并设定目标值
getset key(key的名称) value(目标值)
示例:将key:name的值设定为目标值,返回值为原始值
4.getbit key offset
getbit key(key的名称) offset(偏移量)
获取指定key上指定的offset
首先我们要明确一个概念,我们存储到计算机上的数据都是二进制的,也就是我调用set key
指令将数据存到计算机上的时候,它是转换为二进制存储的也就是010101形式的,这个offset
表示二进制从左往右数第几个数,从0
开始
示例:分别查询key:name的偏移量值
5.setbit key offset
设置或清除指定key上的offset
setbit key offset
示例:设置key:name 偏移量为0的值,只能设置0和1,要不然会报错,返回值为旧的偏移量值
通过上面我们可以看到,原本name
的值为ALiangXLogic
,修改了offset之后呢就变成了\xc1LiangXLogic
6.getrange key start stop
返回指定key值的子字符串
getrange key start(开始) stop(结束)
示例:截取key:name值的子字符串
7.mget key1 key2 …
同时获取一个或多个key的值
mget key1 [key...]
示例:同时获取key:name、key:age、key:sex的值
8.mset key1 value1 key2 value2 …
同时设置一个或多个key的值
mset key1 value1 [key value...]
示例:同时设置key:name、key:age、key:sex的值
9.setnx key value
当且仅当所有给定 key 都不存在才设置key的值,若key存在则返回0
setnx key value
示例:因为key:name存在,所以设置失败
10.msetnx key value [key value …]
当且仅当所有给定 key 都不存在才设置key的值,可设置多个,若key存在则返回0
msetnx key value [key value ...]
示例:设置多个key的值,如果有一个key存在,则全部都不成功,成功返回1,反之返回0
11.strlen key
返回key的值长度
strlen key
示例:返回key:name所对应值的长度
12.setex key seconds value
设置一个有时间限制的key-value
setex key seconds(单位为秒) value
示例:设置一个key,它的有效时间为10秒,10秒内可以获取到它的值,10秒后自动销毁这个key-value
13.psetex key milliseconds value
设置一个有时间限制的key-value,和setex
的区别是pasetex
为毫秒为单位,setex
是以秒为单位
14.setrange key offset value
用 value 参数覆写给定 key 所储存的字符串值,从偏移量 offset 开始,返回值为修改后字符串的长度
这里需要注意一点,这里的offset是按字符串的长度来计算的
比如ALiang
,字符L
的offset为1
,字符n
的offset为4
示例:
15.incr key
将key存储的数字型加1,若key对应的值为String则会报错
示例:
16.incrby key increment
将key所存储的数字加上指定值
incrby key increment(指定值)
示例:给count加上10
17.incrbyfloat key increment
将key所存储的数字加上指定浮点型值
incrbyfloat key increment(指定值)
18.decr key
将key存储的数字减1
19.decrby key increment
将key存储的数字减去指定值
decrby key increment(指定值)
20.append key value
当key已存在,且value的类型为字符串时,会将此value加到原字符串后,如果key不存在,相当于执行set key value
语句
append key value(追加字符串)
示例:
list(列表)
redis中的list可以简单理解为一个最大容量为2^32 - 1 的动态数组
lpush key value [value…]、rpush key value [value…]、lpop key、rpop key
上面一幅图就是我们使用lpush
和rpush
放入数据时,会从不同的位置放入
举个栗子
首先执行lpush指令从列表头部塞入一个zhangsan
,此时zhangsan
在左边第一个,接着再从头部塞入lisi
,lisi
目前位于zhangsan
左边,在执行rpush指令,从尾部塞入一个wangwu
当我执行完上面的语句时,内部列表的结构应该是下图这样的
关于lpop和rpop,lpop表示从列表头部拿出数据,rpop表示从列表尾部拿出数据,如果没有数据则返回(nil)
blpop key1 [key2] timeout,brpop key1 [key2] timeout
blpop,从列表左边取出数据;brpop,从列表右边取出数据
这两条指令相比较于lpop和rpop,首先blpop和brpop能设置超时时间,当列表中无数据时,它们俩不会立即返回(nil)
,而是等待,等待时长为自定义的timeout
,其次可以pop多个列表的数据,但是对于多个列表只能返回一个数据,就是pop的第一个列表的第一个数据
示例:
lrange key start stop
获取指定列表中的元素,strat表示从哪开始,stop表示到哪结束
示例:
llen key
获取已存在列表的长度,若列表不存在或列表中没元素则返回0
示例:
lindex key index
通过索引来获取列表特定的值
示例:
ltrim key start stop
将列表中索引下标位于start-stop之间的元素保存下来,其它的直接删除
示例:
set(集合)
redis的set有几个特点:
1.集合成员唯一,不可重复
2.无序性
3.通过哈希表实现
下面我直接使用表格的形式来给大家展现基本命令的使用
指令 | 含义 | 示例 |
---|---|---|
sadd key value [value…] | 向set集合中插入一个或多个成员 | ![]() |
srem key value [value…] | 移除set集合中的一个或多个成员 | ![]() |
scard key | 获取set集合中成员数 | ![]() |
sdiff key1 [key…] | 返回第一个集合于后面集合的差集 | ![]() |
sdiffstore destination key1 [key…] | 将第一个集合与后面其它集合的差集存到destination(一个新的集合)中 | ![]() |
sismember key value | 判断value是否为set集合的成员,存在返回1,不存在返回0 | ![]() |
smembers key | 返回set集合中的所有对象 | ![]() |
srandmenber key count [count … ] | 随机返回集合中一个或多个对象 | ![]() |
sinter key1 [key …] | 返回给定集合的交集 | ![]() |
sinterstore destination key1 [key …] | 将给定集合的交集存到destination(一个新的集合) | ![]() |
sunion key [key …] | 返回指定集合的并集 | ![]() |
sunionstore destination key [key …] | 将指定集合的并集存到destination(一个新的集合) | ![]() |
hash(哈希表)
首先我们要知道hash的数据结构,在redis中 key - value,这里的value为hash,而hash内部的数据结构也是key - value的形式,所以在redis里,对hash的数据结构其实是这样的 key - hash(key - value)这样的
下面为redis里hash常用的指令
指令 | 含义 | 示例 |
---|---|---|
hmset key field value [field value …] | 设置一个或多个hash值 | ![]() |
hmget key field [field …] | 根据一个或多个field获取hash表中一个或多个值 | ![]() |
hgetall key | 获取此hash表中所有的key-value | ![]() |
hkeys key | 获取此hash表中所有的key | ![]() |
hvals key | 获取此hash表中所有的value | ![]() |
hsetnx key field value | 当且仅当字段field不存在,则为其设置value | ![]() |
hincrby key field incrment | 为hash表中字段为field的整数值加上incrment,返回值为计算后的值 | ![]() |
hlen key | 返回hash的key - value对数 | ![]() |
hexists key field | 返回hash指定的字段是否存在,存在返回1,不存在返回0 | ![]() |
hdel key field [field …] | 删除hash中一个或多个key | ![]() |
hscan key cursor [MATCH pattern] [COUNT count] | 迭代hash内部的key - value 对 ,count 默认为 10 | ![]() |
zset(有序集合)
它和前面的Set有什么不同呢?其实有序集合内部就是维护了一个score
,来维护它的有序,我们可以用它来做一个排行榜,一个人访问一次就让它的score + 1
我来给大家举个栗子
我在将字段添加到集合中的时候,在前面还给每个字段附上了一个分数,也就是说,我的排序是根据所定义的分数来的,所以维护了此集合的有序性
下面为常用字段
指令 | 含义 | 示例 |
---|---|---|
zcard key | 返回集合中的成员个数 | ![]() |
zcount key min max | 返回指定集合中分数范围内的成员 | ![]() |
zincrby key incrment member | 向集合中指定的成员原本的分数加上incrment,返回值为计算后的分数 | ![]() |
zrange key start stop | 按分数从小到大返回member | ![]() |
zrevrank key member | 返回成员的排名,按分数从大到小排 | ![]() |
zscore key member | 返回集合内指定成员的分数 | ![]() |
zrank key member | 返回集合内指定成员的索引值 | ![]() |
zrem key member [member …] | 移除集合内一个或多个成员的信息,移除n个返回n,移除失败返回0 | ![]() |
总结
上面只是5种基本数据结构的基本指令,更多指令请参考redis指令大全
转载请标注原作者,谢谢你们的支持,能给个小心心吗?
完成:2021/4/07 22:52 ALiangXLogic