美文网首页
Redis5数据类型1-String

Redis5数据类型1-String

作者: 轻轻敲醒沉睡的心灵 | 来源:发表于2022-03-16 09:56 被阅读0次

上次说到Redis5提供六种数据类型来存储值:string字符串类型hash散列类型list列表类型set集合类型zset(SortedSet)有序集合类型stream流类型。现在把这几种类型具体分析一下。

1. Redis的key

redis的key 值是二进制安全的(一种主要用于字符串操作函数相关的计算机编程术语),这意味着可以用任何二进制序列作为key值,从形如name的简单字符串到一个JPEG文件的内容都可以,空字符串也是有效key值。redis建议使用字符串做为key的类型。key取值规范如下:

  • 键值不需要太长,消耗内存,在数据中查找这类键值的计算成本较高
  • 键值不宜过短,可读性较差,通常建议见名知意

2. string字符串

一种最基本的Redis值类型(字节数组)。Redis字符串是二进制安全的,一个Redis字符串能包含任意类型的数据。例如: 一张JPEG格式的图片或者一个序列化的Ruby对象。一个字符串类型的值最多能存储512M字节的内容。

2.1 赋值 set

set key value

set name 张三
set name 张三 ex 10  # EX 设置过期时间,秒,等同于SETEX key seconds value
set name 张三 px 5000  # pX 设置过期时间,秒,等同于SETpX key seconds value
set name 张三 nx  #  name 不存在时,才能写入,等同于SETNX key value
set name 张三 xx  #  name 存在时,才能写入
mset name 张三  age 18 phone 1888888888 # 设置多个key-value键值对
msetnx name 张三 age 18 phone 1888888888 # 设置多个key-value键值对,原子操作,有一个不成功都不成功

2.2 取值 get

get key

127.0.0.1:6379> get name
张三
127.0.0.1:6379> mget name age phone
张三
18
1888888888

2.3 返回旧值并设置新值 getset

getset key value

127.0.0.1:6379> getset phone 16666666666
1888888888

2.4 向尾部追加值 append

APPEND key value

127.0.0.1:6379> append name 李四
12             # 返回值是追加后字符串的总长度
127.0.0.1:6379> get name
张三李四
127.0.0.1:6379>

2.5 字符串长度 strlen

strlen key

127.0.0.1:6379> strlen name
12
127.0.0.1:6379> strlen phone
11
127.0.0.1:6379>

2.6 数值增减

字符串值会被解释成64位有符号的十进制整数来操作,但输出结果依然转成字符串。string类型的,底层实现是int,实际上操作的还是数字。

  • incr
127.0.0.1:6379> set id 1
OK
127.0.0.1:6379> incr id
2
127.0.0.1:6379> get id
2
127.0.0.1:6379> incr id
3
127.0.0.1:6379>
  • incrby 增加指定的整数
127.0.0.1:6379> incrby id 3
6
127.0.0.1:6379> incrby id 2
8
127.0.0.1:6379>
  • decr
127.0.0.1:6379> decr id
7
127.0.0.1:6379>
  • decrby 减少指定的整数
127.0.0.1:6379> decrby id 2
5
127.0.0.1:6379>

注意事项:

  • 当value为整数数据时,才能使用以下命令操作数值的增减
  • 数值递增都是原子操作
  • 可以做订单、商品的自增主键

2.7 截取字符串

getrange key start end
索引值从0开始,负数表示从字符串右边向左数起,-1表示最右一个字符,负号减轻复杂度。

127.0.0.1:6379> getrange name 0 -1  # 从开始到结尾
张三李四
127.0.0.1:6379> getrange phone 0 2
166
127.0.0.1:6379>

2.8 替换字符串

setrange key offset value

127.0.0.1:6379> setrange phone 2 x
11
127.0.0.1:6379> get phone
16x66666666
127.0.0.1:6379> setrange phone 3 ****
11
127.0.0.1:6379> get phone
16x****6666
127.0.0.1:6379>

2.9 位图bitmap - 字节数组

位图不是真正的数据类型,它是定义在字符串类型中的

  • 赋值 setbit getbit
127.0.0.1:6379[1]> setbit k1 1 1 # 将二进制数向右偏移1位,并将此位的0设为1
(integer) 0
127.0.0.1:6379[1]> get k1
"@"    # 二进制 0 1 0 0 0 0 0 0 对应的ASCII码是@
127.0.0.1:6379[1]>setbit k1 9 1
(integer) 0
127.0.0.1:6379[1]> get k1
"@@" # 二进制 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0对应的2个字节:8bit(位)= 1Byte(字节)
127.0.0.1:6379[1]> getbit k1 1
(integer) 1
127.0.0.1:6379[1]> getbit k1 2
(integer) 0
127.0.0.1:6379[1]> bitpos k1 1 # 查找 1 在k1中第一次出现的位置
(integer) 1
127.0.0.1:6379[1]> bitpos k1 0 # 查找 0 在k1中第一次出现的位置
(integer) 0
127.0.0.1:6379[1]> bitpos k1 1 0 # 查找 1 在k1的第1个字节中第一次出现的位置,注意最后的0表示下标是0的字节,现在k1只有2个字节(下标0、1),16位长度
(integer) 1
127.0.0.1:6379[1]> bitpos k1 1 1 # 查找 1 在k1的第2个字节中第一次出现的位置,注意最后的1表示下标是1的字节,现在k1只有2个字节(下标0、1),16位长度
(integer) 9
127.0.0.1:6379[1]>
  • 位运算
127.0.0.1:6379[1]> setbit k2 1 1
(integer) 0
127.0.0.1:6379[1]> bitop and res1 k1 k2  # k1和k2二进制的逻辑与,结果保存到res1
(integer) 2
127.0.0.1:6379[1]> get res1
@
127.0.0.1:6379> bitop or res2 k1 k2 # k1和k2二进制的逻辑或,结果保存到res2
2
127.0.0.1:6379> get res2
A@
127.0.0.1:6379> bitop xor res3 k1 k2 # k1和k2二进制的逻辑异或,结果保存到res3
2
127.0.0.1:6379> get res3
@
127.0.0.1:6379> bitop not res4 k1 # k1二进制的逻辑非,结果保存到res4
2
127.0.0.1:6379>

注意:除了 NOT 操作之外,其他操作都可以接受一个或多个 key 作为输入,当 BITOP 处理不同长度的字符串时,较短的那个字符串所缺少的部分会被看作 0,空的 key 也被看作是包含 0 的字符串序列

  • 计数 BITCOUNT
    统计二进制中1的个数
127.0.0.1:6379> bitcount k1 0 0  # 注意 0 0表示是字节下标从0到0的范围,也就是第1个字节(8位)中1的个数
2
127.0.0.1:6379> bitcount k1 0 1  # 表示下标0、1这2个字节中1的个数
3
127.0.0.1:6379> bitcount k1 1 1  #表示下标为1这个字节中1的个数
1
127.0.0.1:6379>
  • bitmap应用
    • 统计用户的活跃天数
      用户ID为key,天作为offset,上线置为1
      366天,1字节可以统计8天,只需46字节即可统计全年活跃天数
      例:id为38的用户第15天上线:setbit id38 14 1
      统计天数用:bitcount id38 0 -1
    • 统计每天的活跃用户
      日期作为key,用户ID为offset,上线置为1
      假设1000 0000用户,只需 1250000 字节=1250KB=1.25MB就能统计1天的活跃用户
      例:今天 第200个用户上线:setbit 20220315 199 1
      若要统计连续3天的,先用bitop做逻辑或,然后再bitcount

相关文章

  • Redis5数据类型1-String

    上次说到Redis5提供六种数据类型来存储值:string字符串类型、hash散列类型、list列表类型、set集...

  • Redis(二)-基本数据类型

    概述 本节主要分析Redis5大数据类型(对应上一节分析的RedisObject中Type属性:String/Li...

  • Redis Stream类型的使用

    一、背景 最近在看redis这方面的知识,发现在redis5中产生了一种新的数据类型Stream,它和kafka的...

  • Redis5数据类型3-Hash

    1. Hash散列 是指Redis中存储的value值是Hash散列类型的。而Hash也有自己的数据结构: 它是由...

  • Redis5数据类型2-List

    1. List简介 Redis中List是基于Linked List实现,双向无环链表,其中元素是字符串类型。特点...

  • Redis5数据类型6-Stream

    1. Stream 类型介绍 Stream是Redis5.0 引入的一个新的数据类型,官方把它定义为:以更抽象的方...

  • Redis5数据类型5-SortedSet集合

    1. SortedSet集合介绍 SortedSet集合与Set集合类似,有以下特点: 数据是有序的,无重复的 每...

  • Redis5数据类型4-Set集合

    1. Set集合介绍 Set数据有几个特点: 无序的、去重的 元素是字符串类型 最多包含232-1个元素 2. S...

  • mac和centos7 安装redis5

    mac 安装redis5 安装 修改redis密码, 查找requirepass 启动redis centos7 ...

  • centos7安装redis5

    1. 下载redis5最新版:下载地址[http://download.redis.io/releases/] 2...

网友评论

      本文标题:Redis5数据类型1-String

      本文链接:https://www.haomeiwen.com/subject/xcztdrtx.html