Redis 学习笔记1:数据类型
Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及 zset(sorted set:有序集合)。
一、Redis 数据类型-STRING
1、常用命令
SET key value #存
GET key #取
Del key #删除key
INCR key #自增key对应的value的值,增量为1
INCRBY key increment #自增key对应的value的值,增量为 increment
DECR key #递减key对应的value的值,增量为-1
getset key value #命令用于设置指定 key 的值,并返回 key 的旧值。
当 key 没有旧值时,即 key 不存在时,返回 nil
当 key 存在但不是字符串类型时,返回一个错误
2、实例
实例1: set key value
D:\Redis>redis-cli.exe -h 127.0.0.1 -p 6379
127.0.0.1:6379> set set:test 1 # 返回ok 说明成功
OK
127.0.0.1:6379> set set:test1 1
OK
127.0.0.1:6379> set set:test2 1
OK
127.0.0.1:6379> keys * # 列出所有的key
1) "set:test"
2) "set:test2"
3) "set:test1"
127.0.0.1:6379> set system:user 1
OK
127.0.0.1:6379> set system:role 1
OK
127.0.0.1:6379> set system:group 1
OK
127.0.0.1:6379> keys *
1) "system:role"
2) "set:test"
3) "set:test1"
4) "set:test2"
5) "system:group"
6) "system:user"
127.0.0.1:6379>
说明:
set system:user 1
key就是 system:user ;value就是1
实例2:切库
127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]> keys *
(empty list or set)
127.0.0.1:6379[1]> select 0
OK
127.0.0.1:6379> keys *
1) "system:role"
2) "set:test"
3) "set:test1"
4) "set:test2"
5) "system:group"
6) "system:user"
127.0.0.1:6379>
在 redis.conf 文件中,配置项 database 16 设置了数据库的数量为16,默认数据库是0。
可以使用select 命令在连接上指定数据库id。
当我们没有默认选择库时,默认使用 0 库。
实例3:get key
127.0.0.1:6379> set a 1
OK
127.0.0.1:6379> get a
"1"
127.0.0.1:6379> set b {a:b,1:2}
OK
127.0.0.1:6379> get b
"{a:b,1:2}"
127.0.0.1:6379>
实例4:del key
127.0.0.1:6379> keys *
1) "system:role"
2) "b"
3) "set:test"
4) "set:test1"
5) "set:test2"
6) "system:group"
7) "system:user"
8) "a"
127.0.0.1:6379> del a # 删除成功
(integer) 1
127.0.0.1:6379> keys *
1) "system:role"
2) "b"
3) "set:test"
4) "set:test1"
5) "set:test2"
6) "system:group"
7) "system:user"
127.0.0.1:6379>
127.0.0.1:6379> del a #删除失败
(integer) 0
实例5:递增key
127.0.0.1:6379> incr test
(integer) 1
127.0.0.1:6379> get test
"1"
127.0.0.1:6379> incr test
(integer) 2
127.0.0.1:6379> get test
"2"
127.0.0.1:6379> incr test
(integer) 3
127.0.0.1:6379> get test
"3"
127.0.0.1:6379> incrby test 3
(integer) 6
127.0.0.1:6379> get test
"6"
当值(字符串)里是数字时,才可以自增。
实例6:递减key
127.0.0.1:6379> DECR test
(integer) 5
实例7:先取再设置(同时进行)
127.0.0.1:6379> getset test1 1
(nil)
127.0.0.1:6379> get test1
"1"
127.0.0.1:6379> getset test1 2
"1"
127.0.0.1:6379> get test1
"2"
127.0.0.1:6379>
redis getset 命令用于设定指定key的值,并返回key的旧值。
3、STRING 类型的实际场景
场景1:做商品详情和缓存
127.0.0.1:6379> set spu:10001 '{"color":"red","struct":"glass","length":30,"width":25,"price":"1345.20"}'
OK
127.0.0.1:6379> get spu:10001
"{\"color\":\"red\",\"struct\":\"glass\",\"length\":30,\"width\":25,\"price\":\"1345.20\"}"
127.0.0.1:6379>
说明:比如客户端发起请求查询 sup:10001 商品信息,api程序先去redis拿,拿到了就直接返回给api程序,api返回给客户端,这样就起到了做缓存的目的。
场景2:给数据做唯一编码
有一些数据需要唯一的编码去命名,如用例编码。
使用redis 用incr 生成用例编码
127.0.0.1:6379> incr test_case_no
(integer) 1
127.0.0.1:6379> incr test_case_no
(integer) 2
127.0.0.1:6379> incr test_case_no
(integer) 3
场景3:做分布式锁
1、什么是分布式锁:针对多服务的情况,在外面加个分布式锁,每个服务都要在获得分布式锁后进行操作。
2、Redis为什么可以做分布式锁:因为redis是单线程运行的,没有并发,所有请求都是一个一个操作。
3、redis怎么做分布式锁:
expire [key] time #设置一个key有效期
exists [key] # 判断key是否存在
伪代码:
先判断锁是否存在(key存在,exists): 如果存在:pass 如果不存在:set key 'xxx' && 设置过期时间 操作
4、如何设置过期时间&如何判断key是否存在
127.0.0.1:6379> set hqq2 'a'
OK
127.0.0.1:6379> exists hqq2 #判断key是否存在
(integer) 1
127.0.0.1:6379> expire hqq2 10 #设置过期时间为10s
(integer) 1 10秒后再次操作
127.0.0.1:6379> exists hqq2
(integer) 0
127.0.0.1:6379>
5、设置过期时间的实际应用场景:
set key '限时活动'
expire key 10
while get key:
继续活动
活动结束
127.0.0.1:6379> set 618day 'huodong'
OK
127.0.0.1:6379> expire 618day 100
(integer) 1
127.0.0.1:6379> get 618day
"huodong"
127.0.0.1:6379> get 618day
(nil)
4、总结STRING
1、一个key对应一个value
2、Redis的String可以包含任何数据,比如 jpg图片或者序列的对象
3、一个key最大能存储512MB
二、Redis 数据类型-HASH
1、什么是哈希值
哈希值是通常用一个短的随机字母和数字组成的字符串来代表,是一组任意长度的输入信息通过哈希算法得到的“数据指纹”。因为计算机在底层机器码是采用二进制的模式。因此通过哈希算法得到的任意长度的二进制值映射为较短的固定长度的二进制值,即哈希值。此外,哈希值是一段数据唯一且极其紧凑的数值表示形式,如果通过哈希一段明文得到哈希值,哪怕只更改该段明文中的任意一个字母,随后得到的哈希值都将不同。
Redis hash 是一个键值对集合;
Redis hash 是一个string类型的field 和 value 的映射表;
hash 适合存储对象
3、设置
127.0.0.1:6379> hset htest1 key1 1
(integer) 1
127.0.0.1:6379> hget htest1 key1
"1"
127.0.0.1:6379> hset htest1 key2 2
(integer) 1
127.0.0.1:6379> hget htest1 key2
"2"
结构:

4、删除
127.0.0.1:6379[1]> hdel htest1 key1
(integer) 1
127.0.0.1:6379[1]> hget htest1 key1
(nil)
5、是否存在
127.0.0.1:6379[1]> HEXISTS htest1 key1
(integer) 0 #不存在
127.0.0.1:6379[1]> HEXISTS htest1 key2
(integer) 1 #存在
6、展示key的所有的value(第二级的key)
127.0.0.1:6379[1]> hset htest1 key3 3
(integer) 1
127.0.0.1:6379[1]> hset htest1 key4 'a'
(integer) 1
127.0.0.1:6379[1]> hkeys htest1
1) "key2"
2) "key3"
3) "key4"
结构:

7、展示key 的所有的最后一级value
127.0.0.1:6379[1]> hvals htest1
1) "2"
2) "3"
3) "a"
127.0.0.1:6379[1]>
8、获取key下面的所有的键和值
127.0.0.1:6379[1]> hgetall htest1
1) "key2"
2) "2"
3) "key3"
4) "3"
5) "key4"
6) "a"
9、进阶实例
127.0.0.1:6379[1]> hmset w3ckey name 'redis tutorial' description 'redis basic commands for caching' likes 20 visitors 23000
OK
127.0.0.1:6379[1]> hgetall w3ckey
1) "name"
2) "redis tutorial"
3) "description"
4) "redis basic commands for caching"
5) "likes"
6) "20"
7) "visitors"
8) "23000"
127.0.0.1:6379[1]>
说明:
设置了redis的一些描述信息(name,description,likes,visitors)到hash表的w3ckeys中。
10、redis hash 命令
|
序号
|
命令及描述
|
|
1
|
HDEL key field2 [field2] 删除一个或多个哈希表字段
|
|
2
|
HEXISTS key field 查看哈希表 key 中,指定的字段是否存在。
|
|
3
|
HGET key field 获取存储在哈希表中指定字段的值/td>
|
|
4
|
HGETALL key 获取在哈希表中指定 key 的所有字段和值
|
|
5
|
HINCRBY key field increment 为哈希表 key 中的指定字段的整数值加上增量 increment 。
|
|
6
|
HINCRBYFLOAT key field increment 为哈希表 key 中的指定字段的浮点数值加上增量 increment 。
|
|
7
|
HKEYS key 获取所有哈希表中的字段
|
|
8
|
HLEN key 获取哈希表中字段的数量
|
|
9
|
HMGET key field1 [field2] 获取所有给定字段的值
|
|
10
|
HMSET key field1 value1 [field2 value2 ] 同时将多个 field-value (域-值)对设置到哈希表 key 中。
|
|
11
|
HSET key field value 将哈希表 key 中的字段 field 的值设为 value 。
|
|
12
|
HSETNX key field value 只有在字段 field 不存在时,设置哈希表字段的值。
|
|
13
|
HVALS key 获取哈希表中所有值
|
|
14
|
HSCAN key cursor [MATCH pattern] [COUNT count] 迭代哈希表中的键值对。
|
三、Redis 数据类型-LIST
1、redis 列表是简单的字符串列表,按照插入顺序排序。
2、可以添加一个元素到列表的头部(左边)或者尾部(右边)。
3、redis list可以做什么:
1)列表可以做什么:index-value pop append
2)redis list同样可以 pop
4、常用基本命令
5、实践
实践1:从左边插入
127.0.0.1:6379[1]> lpush ltest 1 #从左边插入
(integer) 1
127.0.0.1:6379[1]> lpush ltest 1
(integer) 2 #返回的是添加到第几个数
127.0.0.1:6379[1]> lpush ltest 2
(integer) 3
127.0.0.1:6379[1]> llen ltest #看长度
(integer) 3
127.0.0.1:6379[1]> lrange ltest 0 -1 #第一个0,最后一个-1
1) "2"
2) "1"
3) "1"
得到的结构类似:ltest:[2,1,1]
实践2:从右边插入
127.0.0.1:6379[1]> rpush ltest 3
(integer) 4
127.0.0.1:6379[1]> lrange ltest 0 -1
1) "2"
2) "1"
3) "1"
4) "3"
得到的结构类似:ltest:[2,1,1,3]
实践3:删除
127.0.0.1:6379[1]> lpop ltest #从左边删除
"2"
127.0.0.1:6379[1]> lrange ltest 0 -1
1) "1"
2) "1"
3) "3"
127.0.0.1:6379[1]> rpop ltest #从右边删除
"3"
127.0.0.1:6379[1]> lrange ltest 0 -1
1) "1"
2) "1"
6、redis list 可以在实际工作中做什么?--消息队列
在不使用消息队列服务器的时候,用户的请求数据直接写入数据库,在高并发的情况下数据库压力剧增,使得响应速度变慢。
四、Redis 数据类型-SET(集合)
127.0.0.1:6379[1]> sadd stest redis
(integer) 1
127.0.0.1:6379[1]> sadd stest mongdb
(integer) 1
127.0.0.1:6379[1]> sadd stest mysql
(integer) 1
127.0.0.1:6379[1]> sadd stest mysql
(integer) 0
127.0.0.1:6379[1]> smembers stest
1) "mysql"
2) "mongdb"
3) "redis" 127.0.0.1:6379[1]> srem stest redis #删除某个元素
(integer) 1
127.0.0.1:6379[1]> smembers stest
1) "mysql"
2) "mongdb"
127.0.0.1:6379[1]> 127.0.0.1:6379[1]> scard stest #查看有几个元素
(integer) 2
127.0.0.1:6379[1]> sadd stest hqq
(integer) 1
127.0.0.1:6379[1]> scard stest
(integer) 3
127.0.0.1:6379[1]> smembers stest
1) "hqq"
2) "mysql"
3) "mongdb"
127.0.0.1:6379[1]> 随机删除:(因为是无序的)
127.0.0.1:6379[1]> spop stest
"mysql"
127.0.0.1:6379[1]> spop stest
"mongdb"
5、实际应用场景
1)可以使用Redis的Set数据类型跟踪一些唯一性数据
五、Redis 数据类型-SORTEDSET
4、实战
127.0.0.1:6379[1]> zadd ztest 1 case1
(integer) 1
127.0.0.1:6379[1]> zadd ztest 2 case3
(integer) 1
127.0.0.1:6379[1]> zadd ztest 3 case2
(integer) 1
127.0.0.1:6379[1]> zrange ztest 0 -1
1) "case1"
2) "case3"
3) "case2"
127.0.0.1:6379[1]>
长度:
127.0.0.1:6379[1]> zcard ztest
(integer) 3 删除指定元素:
127.0.0.1:6379[1]> zrem ztest case1
(integer) 1
127.0.0.1:6379[1]> zrange ztest 0 -1
1) "case3"
2) "case2"
127.0.0.1:6379[1]> 返回索引:
127.0.0.1:6379[1]> zrank ztest case2
(integer) 1
127.0.0.1:6379[1]> zrank ztest case3
(integer) 0
5、实际应用场景
六、Redis 的数据库操作
• select [index]
• keys [partten]
• del [key]
• type [key]
• exists [key] #判断是否存在key
• expire [key] time #设置超时时间
• ttl a #查看key还剩多长时间
• flushdb #删除指定db
• flushall #删除所有db
Redis 学习笔记1:数据类型的更多相关文章
- Redis学习笔记1-Redis数据类型
Redis数据类型 Redis支持5种数据类型,它们描述如下: Strings - 字符串 字符串是 Redis 最基本的数据类型.Redis 字符串是二进制安全的,也就是说,一个 Redis 字符串 ...
- Redis学习笔记(三)Redis支持的5种数据类型的总结
继续Redis学习笔记(二)来说说剩余的三种数据类型. 三.列表类型(List) 1.介绍 列表类型可以存储一个有序的字符串列表,常用的操作是向列表两端添加元素,或者获得列表的一段片段.列表类型内部是 ...
- Redis学习笔记(二)Redis支持的5种数据类型的总结之String和Hash
引言 在Redis学习笔记(一)中我们已经会安装并且简单使用Redis了,接下来我们一起来学习下Redis支持的5大数据类型. 简介 Redis是REmote DIctionary Server(远程 ...
- Redis学习笔记(二) Redis 数据类型
Redis 支持五种数据类型:string(字符串).list(列表).hash(哈希).set(集合)和 zset(有序集合),接下来我们讲解分别讲解一下这五种类型的的使用. String(字符串) ...
- Redis学习笔记~目录
回到占占推荐博客索引 百度百科 redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合). ...
- Redis学习笔记4-Redis配置详解
在Redis中直接启动redis-server服务时, 采用的是默认的配置文件.采用redis-server xxx.conf 这样的方式可以按照指定的配置文件来运行Redis服务.按照本Redi ...
- Redis学习笔记(二)-key相关命令【转载】
转自 Redis学习笔记(二)-key相关命令 - 点解 - 博客园http://www.cnblogs.com/leny/p/5638764.html Redis支持的各种数据类型包括string, ...
- Redis学习笔记(1)——Redis简介
一.Redis是什么? Remote Dictionary Server(Redis) 是一个开源的使用ANSI C语言编写.遵守BSD协议.支持网络.可基于内存亦可持久化的日志型.Key-Value ...
- Redis学习笔记4-Redis配置具体解释
在Redis中直接启动redis-server服务时, 採用的是默认的配置文件.採用redis-server xxx.conf 这种方式能够依照指定的配置文件来执行Redis服务. 依照本Redi ...
- redis 学习笔记(6)-cluster集群搭建
上次写redis的学习笔记还是2014年,一转眼已经快2年过去了,在段时间里,redis最大的变化之一就是cluster功能的正式发布,以前要搞redis集群,得借助一致性hash来自己搞shardi ...
随机推荐
- 微信小程序上传文件操作示范
社会实践心得体会格式要求 提交的心得体会应为word文档,且图文并茂,全文段前.段后0,1.5倍行距. 题目:自拟,方正小标宋简体,小二号,加粗,居中. 个人信息:题目下方,宋体,小四号,加粗,居中, ...
- Pandas 使用教程 Series、DataFrame
目录 Series (一维数据) 指定索引值 使用 key/value 对象,创建对象 设置 Series 名称参数 DataFrame(二维数据) 使用字典(key/value)创建 loc 属性返 ...
- 文心一言 VS 讯飞星火 VS chatgpt (81)-- 算法导论7.4 6题
六.如果用go语言,考虑对 PARTITION 过程做这样的修改:从数组 A 中随机选出三个元素,并用这三个元素的中位数(即这三个元素按大小排在中间的值)对数组进行划分.求以a 的函数形式表示的.最坏 ...
- 在Godot 3.X中添加触屏摇杆
开源项目地址:https://github.com/shinneider/godot_touchJoyPad 效果图: 下载项目 方法一 直接从godot assets lib下载 如图,直接下载自动 ...
- 8K Star,一款开源仿Notion且AI强化的编辑器:Novel
Notion相信大家都不陌生了,一款非常好用的笔记软件,TJ君也一直在用来记笔记和写文章.关于Notion的替代品,之前有给大家推荐AFFiNE ,但这个还是一个比较成型的软件. 那么如果想开发一个类 ...
- c++ 常用的 STL
c++ 中常用的 STL vector //vector 变长数组 倍增的思想(倍增:系统为每一个程序分配空间的时候,所需要的时间和空间大小无关,与请求次数相关)尽量减少请求的次数 /* 返回元素的个 ...
- DotNetGuide新增C#/.NET/.NET Core充电站(让你学习不迷路)
DotNetGuide简介 记录.收集和总结C#/.NET/.NET Core基础知识.学习路线.开发实战.学习视频.文章.书籍.项目框架.社区组织.开发必备工具.常见面试题.面试须知.简历模板.以及 ...
- Python来源介绍
python来源 1.1 Python来源 1989年的圣诞节,一位来自荷兰,名叫Guidio van Rossum的年轻帅小伙子,为了打发无趣的时光,决定改善他参与设计,不是很满意的ABC语言,随着 ...
- 深入理解 Python 虚拟机:进程、线程和协程
深入理解 Python 虚拟机:进程.线程和协程 在本篇文章当中深入分析在 Python 当中 进程.线程和协程的区别,这三个概念会让人非常迷惑.如果没有深入了解这三者的实现原理,只是看一些文字说明, ...
- Unity - EditorWindow 折叠树显示(IMGUI)
仅适用于2018之前的版本,有UIElements或者UIWidgets的最好用新的 基本实现 树节点 public interface ITreeNode { ITreeNode Parent { ...