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 ...
随机推荐
- MySQL 慢查询探究分析
背景: 性能测试过程中,数据库往往是造成性能瓶颈之一,而数据库瓶颈中sql 语句又是值得探究分析的一环,其中慢查询是重点优化对象,在MySQL中,慢查询是指查询执行时间较长或者消耗 较多资源的查询语句 ...
- ps aux 命令使用
转载请注明出处: ps aux命令是一个常用的Linux/Unix系统命令,它用于查看正在运行的进程信息.下面是该命令使用的参数介绍.命令响应结果参数介绍以及一些使用实例的总结: 命令使用参数介绍 ...
- 6-MySQL查询条件
在MySQL中,高级查询是指使用更复杂的查询语句和操作符来检索和操作数据库中的数据.高级查询可以帮助您更精确地找到所需的信息,并提高查询的效率和灵活性. 以下是高级查询的一些常见应用场景和意义: 连接 ...
- Solution -「洛谷 P3600」随机数生成器
Desciption Link. 给定一个值域在 \([1,x]\) 的长度为 \(n\) 的序列(由随机数构成),求给定一组区间中的最小值的最大值的期望. Solution 记: \[w=\max\ ...
- C++ 重载运算符在HotSpot VM中的应用
C++支持运算符重载,对于Java开发者来说,这个可能比较陌生一些,因为Java不支持运算符重载.运算符重载本质上来说就是函数重载.下面介绍一下HotSpot VM中的运算符重载. 1.内存分配与释放 ...
- Docker Swarm + Harbor + Portainer 打造高可用,高伸缩,集群自动化部署,更新。
Docker Swarm是Docker官方自带的容器编排工具,Swarm,Compose,Machine合称Docker三剑客.Docker Swarm对于中小型应用来说,还是比较方便,灵活,当然K8 ...
- Oracle字符串函数-Translate()总结
Oracle的Translate(expr,from_string,to_string)是字符串操作函数,实现from_string,to_string字符的一 一替换 1)典型示例: select ...
- destoon9.0游戏自媒体类型综合资讯门户模板
随着时代发展,自媒体资讯适合当前的互联网情形.呕心沥血开发的一套自媒体综合门户网站模板,本模板采用纯手写开发,带会员中心.首页,列表页,内容页,搜索页面精心编写,非常大气,并配移动端.注意:模板目前只 ...
- Termius for macOS or Windows Download ssh
mac电脑 苹果系统 window 系统 链接 服务器,访问 ecs ,ssh链接 工具 下载地址:http://pgyd.online/?website/53.html Termius for ...
- Unity - UIWidgets 1. 从Hello world开始
安装参照github的README.UIWidgets相当于Flutter的一个Unity实现(后面表示UIWidgets和UGUI区别时直接称"Flutter"),是把承载的所有 ...