Redis学习笔记(2)

Redis学习笔记(2)

1、Redis数据结构

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

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

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

2、Redis常用指令

命令学习网站:http://doc.redisfans.com/index.html

2.1、String类型

赋值语法:SET key value

127.0.0.1:6379> set k1 zhangsan
OK

取值语法: GET key

127.0.0.1:6379> get k1
"zhangsan"

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

127.0.0.1:6379> mset k2 lisi k3 wangwu
OK

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

127.0.0.1:6379> mget k2 k3
1) "lisi"
2) "wangwu"

删除语法:DEL key

127.0.0.1:6379> del k3
(integer) 1
127.0.0.1:6379> get k3
(nil)

2.2 、字符串数字的递增与递减

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

递增数字语法: INCR key

递减数值语法: DECR key

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

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

递增

127.0.0.1:6379> incr num
(integer) 1
127.0.0.1:6379> incr num
(integer) 2

递减

127.0.0.1:6379> decr num
(integer) 1

指定步长:(了解)

127.0.0.1:6379> incrby num2 2
(integer) 2
127.0.0.1:6379> incrby num2 3
(integer) 5
127.0.0.1:6379> decrby num2 2
(integer) 3
127.0.0.1:6379> decrby num2 1
(integer) 2

2.3 、Hash散列(了解)

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

赋值语法: HSET key field value

  • 设置一个字段值, HSET命令不区分插入和更新操作,当执行插入操作时HSET命令返回1,当执行更新操作时 返回0.
127.0.0.1:6379> hset user1 username zhangsan
(integer) 1
127.0.0.1:6379> hset user1 username lisi
(integer) 0

值语法: HGET key field

127.0.0.1:6379> hget user1 username
"lisi"

设置多个字段语法: HMSET key field value [field value …]

127.0.0.1:6379> hmset user1 password 123 age 20
OK

取多个值语法: HMGET key field [field …]

127.0.0.1:6379> hmget user1 password age
1) "123"
2) "20"

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

127.0.0.1:6379> hgetall user1
1) "username"
2) "lisi"
3) "password"
4) "123"
5) "age"
6) "20"

删除字段语法:HDEL key field [field …]

127.0.0.1:6379> hdel user1 username
(integer) 1
127.0.0.1:6379> hgetall user1
1) "password"
2) "123"
3) "age"
4) "20"

可以支持部分修改。

2.4、 队列List

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

向列表左边增加元素: LPUSH key value [value …]

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

127.0.0.1:6379> lpush alist a1 a2 123
(integer) 3
127.0.0.1:6379> lpop alist
"123"
127.0.0.1:6379> lpop alist
"a2"

向列表右边增加元素 : RPUSH key value [value …]

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

127.0.0.1:6379> rpush blist a1 a2 345
(integer) 3
127.0.0.1:6379> rpop blist
"345"

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

127.0.0.1:6379> llen blist
(integer) 1

查看列表语法:LRANGE key start stop

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

示例: LPUSH comment1 ‘{“id”:1,“name”:“商品",“date”:1430295077289}’

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

1,左边进,右边去

127.0.0.1:6379> lpush stulist stu1
(integer) 1
127.0.0.1:6379> lpush stulist stu2
(integer) 2
127.0.0.1:6379> lpush stulist stu3
(integer) 3
127.0.0.1:6379> lpush stulist stu4
(integer) 4
127.0.0.1:6379> lpush stulist stu4
(integer) 5
127.0.0.1:6379> lpush stulist stu5
(integer) 6
127.0.0.1:6379> rpop stulist
"stu1"
127.0.0.1:6379> rpop stulist
"stu2"
127.0.0.1:6379> rpop stulist
"stu3"
127.0.0.1:6379> rpop stulist
"stu4"

2,右边进,左边去。

127.0.0.1:6379> rpush clist stu1
(integer) 1
127.0.0.1:6379> rpush clist stu2
(integer) 2
127.0.0.1:6379> rpush clist stu3
(integer) 3
127.0.0.1:6379> rpush clist stu4
(integer) 4
127.0.0.1:6379> rpush clist stu5
(integer) 5
127.0.0.1:6379> lpop clist
"stu1"
127.0.0.1:6379> lpop clist
"stu2"

2.5、Set集合

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

增加元素语法:SADD key member [member …]

删除元素语法: SREM key member [member …]

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

127.0.0.1:6379> sadd ulist user1
(integer) 1
127.0.0.1:6379> sadd ulist user2
(integer) 1
127.0.0.1:6379> sadd ulist user3
(integer) 1
127.0.0.1:6379> smembers ulist
1) "user2"
2) "user3"
3) "user1"
127.0.0.1:6379> srem ulist user2
(integer) 1
127.0.0.1:6379> smembers ulist
1) "user3"
2) "user1"

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

127.0.0.1:6379> smembers ulist
1) "user3"
2) "user1"
127.0.0.1:6379> sismember ulist user2
(integer) 0
127.0.0.1:6379> sismember ulist user1
(integer) 1

5.6 Zset有序集合(了解)

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

增加元素:ZADD key score member [score member …]

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

获得排名在某个范围的元素列表,并按照元素分数降序返回

语法:ZREVRANGE key start stop [WITHSCORES]

127.0.0.1:6379> zadd num1 10 stu4
(integer) 1
127.0.0.1:6379> zrevrange num1 0 4
1) "stu3"
2) "stu2"
3) "stu1"
4) "stu4"

获取元素的分数 :ZSCORE key member

127.0.0.1:6379> zscore num1 stu2
"30"

删除元素ZREM key member [member …]

127.0.0.1:6379> zrem num1 stu2
(integer) 1
127.0.0.1:6379> zrevrange num1 0 4
1) "stu3"
2) "stu1"
3) "stu4"

获得元素的分数的可以在命令尾部加上WITHSCORES参数

127.0.0.1:6379> zrevrange num1 0 4 withscores
1) "stu3"
2) "40"
3) "stu1"
4) "20"
5) "stu4"
6) "10"

应用:商品销售量;学生排名等

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

127.0.0.1:6379> zincrby num1 2 stu1
"22"

示例: 商品编号1001的销量是9,商品编号1002的销量是10

ZADD sellsort 9 1001 10 1002

商品编号1001的销量加1

ZINCRBY sellsort 1 1001

商品销量排序队列中前3名:

zrevrange sellsort 0 2 withscores

学生排名前3名:

zrevrange stus 0 2 withscores

2.7、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

示例:

redis 127.0.0.1:6379> PFADD mykey "redis"
1) (integer) 1
redis 127.0.0.1:6379> PFADD mykey "java"
1) (integer) 1
redis 127.0.0.1:6379> PFADD mykey "mysql"
1) (integer) 1
redis 127.0.0.1:6379> PFCOUNT mykey
(integer) 3

2.8、其他命令

(1) keys返回满足给定pattern 的所有key

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

(2) exists确认一个key 是否存在,存在返回1

127.0.0.1:6379> exists num2 //语法:exists key
(integer) 1
127.0.0.1:6379> exists num23
(integer) 0

(3) del删除一个key

127.0.0.1:6379> del num1 //语法: del key 删除存在的key返回1,不存在的key返回0
(integer) 1
127.0.0.1:6379> del num23
(integer) 0

(4) rename重命名key:rename oldkey newkey

127.0.0.1:6379> rename k1 k11
OK
127.0.0.1:6379> keys *
1) "ulist"
2) "k2"
3) "user1"
4) "num2"
5) "clist"
6) "k11"

(5) type返回值的类型: type key

127.0.0.1:6379> type ulist
set
127.0.0.1:6379> type k11
string
127.0.0.1:6379> type alist
list

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

(6) EXPIRE key seconds

  • 设置key的生存时间(单位:秒)key在多少秒后会自动删除

    TTL key 查看key剩余的生存时间

    PERSIST key 清除生存时间

127.0.0.1:6379> set a1 123
OK
127.0.0.1:6379> get a1
"123"
127.0.0.1:6379> expire a1 60
(integer) 1
127.0.0.1:6379> ttl a1
(integer) 56
127.0.0.1:6379> ttl a1
(integer) 51
127.0.0.1:6379> ttl a1
(integer) 47

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

(8) 删除当前选择数据库中的所有key:flushdb

(9) 删除所有数据库中的所有key:flushall

2.9、Redis的多数据库

一个redis实例key包括多个数据库,客户端可以指定连接某个redis实例的哪个数据库,就好比一个mysql中创建多 个数据库,客户端连接时指定连接哪个数据库。

一个redis实例最多可提供16个数据库,下标从0-15,客户端默认连接第0号数据库,也可以通过select选择连接哪 个数据库,如下连接1号库:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-V3EGuaa5-1627294790221)(C:\Users\Mr-DUAN\AppData\Roaming\Typora\typora-user-images\image-20210726175759921.png)]

切换至0数据库下面

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pxjgmGXN-1627294790222)(C:\Users\Mr-DUAN\AppData\Roaming\Typora\typora-user-images\image-20210726175815404.png)]

将key的数据移动到1号数据库: move key 数据库编号

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ys2pYBZ6-1627294790223)(C:\Users\Mr-DUAN\AppData\Roaming\Typora\typora-user-images\image-20210726175836637.png)]

379> ttl a1
(integer) 51
127.0.0.1:6379> ttl a1
(integer) 47


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

(8) 删除当前选择数据库中的所有key:flushdb 

(9) 删除所有数据库中的所有key:flushall

### 2.9、Redis的多数据库 

一个redis实例key包括多个数据库,客户端可以指定连接某个redis实例的哪个数据库,就好比一个mysql中创建多 个数据库,客户端连接时指定连接哪个数据库。 

一个redis实例最多可提供16个数据库,下标从0-15,客户端默认连接第0号数据库,也可以通过select选择连接哪 个数据库,如下连接1号库:

![在这里插入图片描述](https://img-blog.csdnimg.cn/b5df2f568ef941e497415bf0a4add099.png)


切换至0数据库下面

![在这里插入图片描述](https://img-blog.csdnimg.cn/6e500a52e7da4c71a7db432e017aceca.png)

将key的数据移动到1号数据库: move key 数据库编号

![在这里插入图片描述](https://img-blog.csdnimg.cn/d5927a3428f24a208e4e9f95c1c31377.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L01yREFX,size_16,color_FFFFFF,t_70)


尚硅谷是一个教育机构,他们提供了一份关于Redis学习笔记。根据提供的引用内容,我们可以了解到他们提到了一些关于Redis配置和使用的内容。 首先,在引用中提到了通过执行命令"vi /redis-6.2.6/redis.conf"来编辑Redis配置文件。这个命令可以让你进入只读模式来查询"daemonize"配置项的位置。 在引用中提到了Redis会根据键值计算出应该送往的插槽,并且如果不是该客户端对应服务器的插槽,Redis会报错并告知应该前往的Redis实例的地址和端口。 在引用中提到了通过修改Redis的配置文件来指定Redis的日志文件位置。可以使用命令"sudo vim /etc/redis.conf"来编辑Redis的配置文件,并且在文件中指定日志文件的位置。 通过这些引用内容,我们可以得出结论,尚硅谷的Redis学习笔记涵盖了关于Redis的配置和使用的内容,并提供了一些相关的命令和操作示例。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Redis学习笔记--尚硅谷](https://blog.csdn.net/HHCS231/article/details/123637379)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Redis学习笔记——尚硅谷](https://blog.csdn.net/qq_48092631/article/details/129662119)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值