【Redis】redis数据结构和常用指令

Redis是一种基于内存的数据库,并且提供一定的持久化功能,它是一种键值(key-value)数据库,使用 key 作为索引找到当前缓存的数据,并且返回给程序调用者。

Redis数据结构

当前的 Redis 支持 6 种数据类型,它们分别是字符串(String)、列表(List)、集合(set)、哈希结构(hash)、有序集合(zset)和基数(HyperLogLog)

数据类型数据类型存储的值说明
String(字符串)可以保存字符串、整数和浮点数可以对字符串进行操作,比如增加字符串或者求字串;如果是整数或者浮点数,可以实现计算,比如自增等
List(列表)它是一个链表,它的每一个节点都包含一个字符串Redis支持从链表的两端插入或者弹出节点,或者通过偏移对它进行裁剪;还可以读取一个或者多个节点,根据条件删除或者查找节点等
Set(集合)它是一个收集器,但是是无序的,在它里面每一个元素都是一个字符串,而且是独一无二,各不相同的可以新增、读取、删除每个元素;检测一个元素是否在集合中;计算它和其它集合的交集、并集和差集等;随机从集合中读取元素
Hash(哈希散列表)它类似于Java语言中的Map,是一个键值对应的无序列表可以增、删、改、查单个键值对,也可以获取所有的键值对
ZSet(有序集合)它是一个有序的集合,可以包含字符串、整数、浮点数、分值(score)、元素的排序是依据分值的大小来决定的可以增、删、改、查根据分值的范围或者成员来获取对应的元素
HyperLogLog(基数)它的作用是计算重复的值,以确定存储的数量只提供基数的运算,不提供返回的功能

Redis的多数据库

在说常用指令前,先了解一下redis的多数据库。一个redis实例key包括多个数据库,客户端可以指定连接某个redis实例的哪个数据库,就好比一个mysql中创建多个数据库,客户端连接时指定连接哪个数据库。一个redis实例最多可提供16个数据库,下标从0-15,客户端默认连接第0号数据库:
在这里插入图片描述
可以通过select选择连接哪个数据库,如下连接1号库:

192.168.159.129:6379> select 1
OK
192.168.159.129:6379[1]> keys *
(empty list or set)

Redis常用指令

Key键值的基本指令

keys:返回满足给定pattern 的所有key

keys user* //查询以user开头的key
keys * //查询所有的key

exists key:确认一个key 是否存在,存在返回1

192.168.159.129:6379> exists password1
(integer) 0
192.168.159.129:6379> exists password
(integer) 1

del key:删除一个key

192.168.159.129:6379> del password1	//语法: del key 删除存在的key返回1,不存在的key返回0
(integer) 0
192.168.159.129:6379> del password
(integer) 1

rename oldkey newkey:重命名key

192.168.159.129:6379> rename k1 k2
OK
192.168.159.129:6379> keys *
1) "k2"
2) "username"

type key:返回值的类型

192.168.159.129:6379> type username
string

设置key的生存时间:缓存的数据一般都是需要设置生存时间的,即:到期后数据销毁。

  • expire key seconds:设置key的生存时间(单位:秒)key在多少秒后会自动删除
  • ttl key:查看key剩余的生存时间
  • persist key:清除生存时间
192.168.159.129:6379> set a1 123
OK
192.168.159.129:6379> expire a1 60
(integer) 1
192.168.159.129:6379> ttl a1
(integer) 49
192.168.159.129:6379> ttl a1
(integer) 46
192.168.159.129:6379> persist a1
(integer) 1
192.168.159.129:6379> ttl a1
(integer) -1

info:获取服务器信息和统计

flushdb删除当前选择数据库中的所有key

flushall删除所有数据库中的所有key(谨慎使用)

String类型

赋值语法:set key value

192.168.159.129:6379> set k1 lisi
OK

取值语法:get key

192.168.159.129:6379> get k1
"list"

设置多个键语法: mset key value [key value …]

192.168.159.129:6379> mset s1 zhangsan s2 lisi
OK

获取多个键值语法: mget key [key …]

192.168.159.129:6379> mget s1 s2
1) "zhangsan"
2) "lisi"

删除语法:del key

192.168.159.129:6379> del s2
(integer) 1
192.168.159.129:6379> get s2
(nil)

字符串数字的递增与递减

递增数字:当存储的字符串是整数时,Redis提供了一个实用的命令incr,其作用是让当前键值递增,并返回递增后的值。

递增数字语法:incr key

192.168.159.129:6379> set num 1
OK
192.168.159.129:6379> get num
"1"
192.168.159.129:6379> incr num
(integer) 2

递减数值语法:decr key

192.168.159.129:6379> get num
"3"
192.168.159.129:6379> decr num
(integer) 2

增加指定的整数语法:incrby key increment

192.168.159.129:6379> get num
"4"
192.168.159.129:6379> incrby num 5
(integer) 9

减少指定的整数语法:decrby key decrement

192.168.159.129:6379> get num
"9"
192.168.159.129:6379> decrby num 6
(integer) 3

Hash散列

hash叫散列类型,它提供了字段和字段值的映射。字段值只能是字符串类型,不支持散列类型、集合类型等其它类型。相当于是对象格式的存储。

赋值语法: hset key field value

设置一个字段值, hset命令不区分插入和更新操作,当执行插入操作时hset命令返回1,当执行更新操作时返回0

192.168.159.129:6379> hset user1 username '张三'
(integer) 1
192.168.159.129:6379> hset user1 username '李四'
(integer) 0

取值语法: hget key field

192.168.159.129:6379> hget user1 username
李四

设置多个字段语法: hmset key field value [field value ...]

192.168.159.129:6379> hmset user1 password 123 age 18
OK

取多个值语法:hmget key field [field ...]

192.168.159.129:6379> hmget user1 password age
123
18

获取所有字段值语法:hgetall key

192.168.159.129:6379> hgetall user1
username
李四
password
123
age
18

删除字段语法:hdel key field [field ...]

192.168.159.129:6379> hdel user1 username
1
192.168.159.129:6379> hgetall user1
password
123
age
18

List队列

Redis的list是采用链表来存储,双向链表存储数据,特点:增删快、查询慢(Linkedlist)。这个队列是有序的。

向列表左边增加元素:lpush key value [value ...]

从列表左边弹出元素:lpop key(临时存储,弹出后从队列中清除)

192.168.159.129:6379> lpush alist a1 a2 a3
3
192.168.159.129:6379> lpop alist
a3

向列表右边增加元素:rpush key value [value ...]

从列表右边弹出元素:rpop key

192.168.159.129:6379> rpush blist b1 b2 b3
3
192.168.159.129:6379> rpop blist
b3

获取列表中元素的个数:llen key

192.168.159.129:6379> llen blist
2

查看列表语法:lrange key start stop

  • 将返回start、stop之间的所有元素(包含两端的元素),索引从0开始,可以是负数,如:“-1”代表最后的一个元素。
192.168.159.129:6379> lrange blist 0 1
b1
b2

临时存储,先进先出。使用双向链表:

1、左边进,右边出

192.168.159.129:6379> lpush stulist stu1 stu2 stu3 stu4
4
192.168.159.129:6379> rpop stulist
stu1
192.168.159.129:6379> rpop stulist
stu2

2、右边进,左边出

192.168.159.129:6379> rpush userlist user1 user2 user3 user4
4
192.168.159.129:6379> lpop userlist
user1
192.168.159.129:6379> lpop userlist
user2

Set集合

Set集合类型:无序、不可重复

增加元素语法:sadd key member [member ...]

192.168.159.129:6379> sadd slist stu1 stu2
2

删除元素语法:srem key member [member ...]

192.168.159.129:6379> srem slist stu2
1

获得集合中的所有元素:smembers key

192.168.159.129:6379> smembers slist
stu1

判断元素是否在集合中:sismember key member

192.168.159.129:6379> smembers slist
stu1
stu3
stu4
192.168.159.129:6379> sismember slist stu1
1
192.168.159.129:6379> sismember slist stu2
0

Zset有序集合

Sortedset又叫zset,是有序集合,可排序的,但是唯一。 Sortedset和set的不同之处,是会给set中的元素添加一个分数,然后通过这个分数进行排序。

增加元素:zadd key score member [score member ...]

  • 向有序集合中加入一个元素和该元素的分数(score),如果该元素已经存在则会用新的分数替换原有的分数。
  • 添加带分数(可用学生成绩,销售数量等来做分数,方便计算排序):
192.168.159.128:6379> zadd num1 90 stu1 80 stu2 70 stu3
3

获得排名在某个范围的元素列表,并按照元素分数降序返回:zrevrange key start stop [WITHSCORES]

获得元素的分数的可以在命令尾部加上WITHSCORES参数
应用:商品销售量,学生排名等

192.168.159.128:6379> zadd num1 90 stu1 80 stu2 70 stu3
3
192.168.159.128:6379> zrevrange num1 0 3 withscores
stu1
90
stu2
80
stu3
70

获取元素的分数:zscore key member

192.168.159.128:6379> zadd num1 55 stu4
1
192.168.159.128:6379> zscore num1 stu4
55

删除元素:zrem key member [member ...]

192.168.159.128:6379> zrevrange num1 0 4
stu1
stu2
stu3
stu4
192.168.159.128:6379> zrem num1 stu4
1
192.168.159.128:6379> zrevrange num1 0 4
stu1
stu2
stu3

给某一个属性加分数或减分,减分时使用负数:zincrby key increment member

192.168.159.128:6379> zscore num1 stu1
90
192.168.159.128:6379> zincrby num1 5 stu1
95
192.168.159.128:6379> zincrby num1 -10 stu1
85

HyoperLogLog基数

HyperLogLog是一种使用随机化的算法,以少量内存提供集合中唯一元素数量的近似值。

HyperLogLog 可以接受多个元素作为输入,并给出输入元素的基数估算值:

  • 基数:集合中不同元素的数量。比如 {‘apple’, ‘banana’, ‘cherry’, ‘banana’, ‘apple’} 的基数就是 3 。
  • 估算值:算法给出的基数并不是精确的,可能会比实际稍微多一些或者稍微少一些,但会控制在合理的范围之内。

HyperLogLog 的优点是,即使输入元素的数量或者体积非常非常大,计算基数所需的空间总是固定的、并且是很小的。
在 Redis 里面,每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基数。这和计算基数时,元素越多耗费内存就越多的集合形成鲜明对比。
但是,因为 HyperLogLog 只会根据输入元素来计算基数,而不会储存输入元素本身,所以 HyperLogLog 不能像集合那样,返回输入的各个元素。

HyperLogLog 相关的一些基本命令:

命令说明
pfadd key element [element …]将指定的元素添加到指定的HyperLogLog 中
pfcount key [key …]返回给定 HyperLogLog 的基数估算值
pfmerge destkey sourcekey [sourcekey …]将多个 HyperLogLog 合并为一个 HyperLogLog

示例:

192.168.159.128:6379> pfadd mykey "redis" "java" "mysql"
1
192.168.159.128:6379> pfcount mykey
3
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

网友小锋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值