Redis数据类型之String——字符串、数值、bitmap

Redis数据类型之String——字符串、数值、bitmap

注意索引位置一般从左到右 0开始,叫正向索引。从右到左-1开始叫反向索引

字符串

字符串有很多操作set、get、append、setrange、getrange等,每个都有自己对应的用处

  1. SET
    SET key value
    设置指定 key 的值。
  2. GET
    GET key
    获取指定 key 的值。
  3. getrange :start和end是按偏移量进行取值,一个字节为一位,偏移量正向从0开始,反向从-1开始。
    GETRANGE key start end
    返回 key 中字符串值的子字符
  4. getset
    GETSET key value
    将给定 key 的值设为 value ,并返回 key 的旧值(old value)。
  5. mget
    MGET key1 [key2…]
    获取所有(一个或多个)给定 key 的值。
  6. setex:设置key的过期时间
    SETEX key seconds value
    将值 value 关联到 key ,并将 key 的过期时间设为 seconds (以秒为单位)。
  7. setnx
    SETNX key value
    只有在 key 不存在时设置 key 的值。
  8. setrange
    SETRANGE key offset value
    用 value 参数覆写给定 key 所储存的字符串值,从偏移量 offset 开始。
  9. strlen
    STRLEN key
    返回 key 所储存的字符串值的长度。
  10. msetnx:一个设置失败,都失败
    MSETNX key value [key value …]
    同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在。
  11. append
    APPEND key value
    如果 key 已经存在并且是一个字符串, APPEND 命令将指定的 value 追加到该 key 原来值(value)的末尾。

数值

比如set test 1。表示给test设置了一个数值为1,但他依旧属于字符串类型。只是他可以运算。

  1. incr
    INCR key
    将 key 中储存的数字值增一。
  2. incrby
    INCRBY key increment
    将 key 所储存的值加上给定的增量值(increment) 。

bitmap(相当于一个二进制地图:map表示地图,所以可以解释为二进制地图,其实里面就是存放的二进制0,1)

这个bitmap有很多的应用场景;一个字节对应8位,设置一个位后如果用get去获取,只能得到该key对应的ASCII码的值,比如我设置 0100 0000,表示给偏移量第二位设置1,他会取到ASCII码的值为 @ 符;

首先写一下他都有哪些操作:

  1. setbit:偏移量是指二进制位,不是上面提到字符串中的偏移量。字符串中是一个字节为一位,这里是一个二进制位为1位。一个字节有8位,0000 0000,表示一个字节
    SETBIT key offset value
    对 key 所储存的字符串值,设置或清除指定偏移量上的位(bit)。清除指覆盖
  2. getbit
    GETBIT key offset
    对 key 所储存的字符串值,获取指定偏移量上的位(bit)。
  3. bitcount
    BITCOUNT key start end
    对 key 所储存的字符串值,计算在偏移量strat和end之间的数值。下面会有对应案例帮助理解
  4. bitop:表示对key 以及后面多个key 进行 operation操作后,赋值给destkey这个键
    BITOP operation destkey key [key…]
    对 key 所储存的字符串值,计算在偏移量strat和end之间的数值。下面会有对应案例帮助理解
  5. bitpos:他表示查找字节中的bit,出现在哪一个二进制位上。start表示字节偏移量,offset表示二进制位偏移量,这个要记住
    BITPOS key bit start end
    对 key 所储存的字符串值,bit表示二进制0或1,start和end表示key中字节位置。

下图圆圈表示一个字节,圆圈中的0表示这个字节对应的字节偏移位。在字节中属于第0位,0和1就相当于数组中的下标,第二行的方框代表二进制,下面是执行了

setbit 1 1
setbit 7 1
setbit 9 1
1,7,9表示二进制位的偏移量既下标。二进制位8个表示一个字节,所以9位置的1显示到了第二个字节里
0100 0001 0100 0000
这就是上面设置三次后得到的值。
第三行表示偏移量位置,8,9,10,11后面未补全。

在这里插入图片描述

案例1:如果设计一个统计用户登录天数的功能怎么实现呢。

功能:统计用户随机时间的登录天数
若果用mysql数据库设计则需要用一个表来存登录数据,需要存用户id和时间字段,一个字段至少4个字节,所以需要部分空间来存储,那么用redis怎么实现呢。
假设,用户每天登录和不登录有两种情况,我们可以用二进制位来表示0或1。1表示登录。然后设置时间,由于时间天数是固定的,365或者366天。那么我们可以用偏移量来设置天数,就按照最大的366来设置,366/8=45.75 约等于46 ,相当于46个字节。一个用户最多用46个字节的内存。
如下:
setbit zhangsan 1 1; --张三第2天登录
setbit zhangsan 7 1; --张三第8天登录
setbit zhangsan 364 1; --张三第365天登录
strlen zhangsan; --占用了46字节长度
bitcount zhangsan -2 -1 --张三最后两天登录的天数为1
-1和-2表示反向索引,反向索引从后往前 -1 ,-2 。正向索引从前往后 0,1,2

在这里插入图片描述

案例2:设计京东618期间,每个登陆用户可以免费领取一次礼物,且京东有2亿用户。

解析: 同样用redis可以实现:首先可以统计日常活跃用户数,因为有一部分用户常年不在线属于僵尸用户。另一部分是活跃用户。如果真要准备2亿礼物,最终会造成很大的损失。所以先统计日常活跃用户可以降低损失。那么问题就变成了统计用户活跃数。但是同一个可能每天都登录用户会有去重。

我们把日期作为key ,把用户作为二进制位数。每个用户对应一个二进制位
setbit 20230101 2 1; --2023年1月1号 3号位索引的用户登录了一次,
setbit 20230102 2 1; --2023年1月2号 3号位索引的用户登录了一次,
setbit 20230102 7 1; --2023年1月2号 8号位索引的用户登录了一次,
bitop or destkey 20230101 20230102 --表示将2023年1月1号的用户登录情况 和2023年1月2号的用户登录情况进行二进制 或 运算。或运算规则,有1则1,最终结果只要用户登录过不管几次都记录为1次。然后把结果赋值给新的bitmap 他的key是destkey

bitcount destkey 0 -1 --统计该bitmap里面有多少用户登录。最终显示在1号和2号里有2个用户登录过
在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/26670.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

UniFi USW-Flex 室内-室外 POE 交换机

选择理由 选择理由是是因为要户外使用,对比下户外可以使用的 POE 交换机并不是很多。 UniFi USW-Flex 室内-室外 5 端口 PoE 千兆交换机能够支持在户外和户内使用。 户外使用需要具有基本的防水性能,尤其是冬天比较寒冷的时候也需要具备一定的环境耐受…

【数据结构】——树的相关习题

目录 一、选择填空判断题题1题2题3题4题5题6题7题8题9 二、应用题题10(遍历序列)题11(存储结构)题12 13(二叉树/树、森林之间的转换)题14(线索二叉树) 一、选择填空判断题 题1 1、设…

JVM那些事 (含经典面试题)

🎉🎉🎉点进来你就是我的人了博主主页:🙈🙈🙈戳一戳,欢迎大佬指点! 欢迎志同道合的朋友一起加油喔🤺🤺🤺 目录 前言: 1. JVM:Java 虚拟机&#x…

由于找不到iutils.dll而造成的错误,要怎么去解决?

在使用电脑或运行某些软件时,有时会遇到“找不到iutils.dll”的错误提示。这个错误通常表示缺少iutils.dll文件或者该文件已经损坏。如果你遇到了这个问题,不要担心,因为有很多方法可以解决这个问题。下面我们一起来看看找不到iutils.dll的问…

API电商 ERP 数据管理

没有 API,应用之间的通信将会被扼杀;软件开发者将不断重写并执行相同功能的软件;创新的脚步将会放缓。 API 随处可见。大到一个软件系统,小到几行程序,只要具备了一定的特征,都可以被称作 API。那么&#…

【网络】基础知识1

目录 网络发展 独立模式 网络互联 局域网LAN 广域网WAN 什么是协议 初识网络协议 协议分层 OSI七层模型 TCP/IP四层(或五层)模型 OSI和TCP/IP对比 网络传输流程 什么是报头 局域网通信原理 同网段的主机通讯 跨网段的主机通讯 数据包封装…

数据治理8大核心模块建设

数据治理是一个去中心化、多元参与的系统工程。一个全面且明确的数据治理体系,可以帮助组织构建生态式、协同化治理路径,最大化地提升整体数据质量,实现数据战略,激活新型生产力。 本文以元数据、主数据、数据标准、数据质量、数…

jenkins主从节点安装及pipeline构建

一、背景 通过Jenkins主节点配置的pipeline下发给从节点执行,从而兼容容器化执行 二、安装主节点 docker-compose.yml jenkins:user: rootrestart: alwaysimage: jenkinsci/blueoceancontainer_name: jenkins# network_mode: hostports:- "8081:8080"-…

【算法与数据结构】209.长度最小的子数组

文章目录 题目一、暴力穷解法二、滑动窗口法完整代码 所有的LeetCode题解索引,可以看这篇文章——【算法和数据结构】LeetCode题解。 题目 一、暴力穷解法 思路分析:这道题涉及到数组求和,那么我们很容易想到利用两个for循环来写,…

移动端浏览器性能优化探索

目录 前言 如何衡量卡顿 FPS 与卡顿的关系 新的衡量指标 浏览器动画渲染 GPU扮演的角色 合理避免回流和重绘 浏览器工作流程 解决方案 在移动端的页面开发过程中,我们经常提及页面性能优化、消除页面卡顿的话题,如何确定优化策略,我…

“老年养生”APP的设计与开发

摘要:我国人口老龄化呈上升趋势,老年人口比重增加。这是我国经济发展的一大挑战,也是老年健康产业的一大机遇。随着我国经济发展,越来越多的人开始关注自己的身体,这导致各种关于健康的网络应用层出不穷。但是经过分析…

【python技能树】python简介

1 Python定义 Python 是一种简单易学并且结合了解释性、编译性、互动性和面向对象的脚本语言。Python提供了高级数据结构,它的语法和动态类型以及解释性使它成为广大开发者的首选编程语言。 Python 是解释型语言: 开发过程中没有了编译这个环节。类似于…

Python中打印彩色信息的方法

在Python中,可以使用print()函数打印出彩色信息。在使用print()打印之前,需要调用os标准库对系统进行设置。 1 os标准库 1.1 简介 os是Operating System的简写,即“操作系统”。os标准库是一个操作系统接口模块,提供了使用操作…

学生成绩管理系统(Java)

目录 ​编辑 需求分析: 登录界面(LoginPanel) 主界面(MainApp) 重写 1.班级重写(cs.practics.bean.BjBean.java) 2.课程重写(cs.practics.bean.CourseBean.java) 3.成绩重写(cs.practics.bean.MarkBean.java) 4.学生重写(cs.practics.bean.StudentBean.java…

Spring Cloud 容错机试 Hystrix 服务降级 RestTemplate:

Ribon的服务降级操作 雪崩效应: 如果短信服务炸了后面的所有服务就会起连锁反应造成全部服务挂掉,这就是雪崩效应,那么其实短信服务又不是我们主要业务,这个时候我们可以采用服务降级,服务降级就是暂时的把短信服务停…

springboot服务端接口公网远程调试 - 实现HTTP服务监听【端口映射】

文章目录 前言1. 本地环境搭建1.1 环境参数1.2 搭建springboot服务项目 2. 内网穿透2.1 安装配置cpolar内网穿透2.1.1 windows系统2.1.2 linux系统 2.2 创建隧道映射本地端口2.3 测试公网地址 3. 固定公网地址3.1 保留一个二级子域名3.2 配置二级子域名3.2 测试使用固定公网地址…

安装CHATGPT保姆级教程(windows版)

ai包链接: 链接:https://pan.baidu.com/s/1tKuG4OfkewlDRU292vx8mw?pwdtw8t 提取码:tw8t 一、安装篇 安装python,使用软件包中的python安装程序安装后检查是否安装成功,cmd窗口运行命令: python –vers…

python自动化爬虫实战

python自动化爬虫实战 偶然的一次机会再次用到爬虫,借此机会记录一下爬虫的学习经历,方便后续复用。 需求:爬取网站数据并存入的csv文件中,总体分为两步 爬取网站数据存到到csv文件中 1、配置爬虫环境 1.1、下载自动化测试驱动 …

【2023最新】Python + Pycharm + Anaconda安装配置一条龙

【2023最新】Python Pycharm Anaconda安装配置一条龙 文章目录 【2023最新】Python Pycharm Anaconda安装配置一条龙1. Python1.1 Python下载1.2 Python安装1.3 测试 2. Pycharm2.1 Pycharm下载2.2 Pycharm安装配置2.3 你好Pycharm 3. Anaconda3.1 Anaconda下载3.2 Anacond…

【网络】TCP通讯(三次握手、四次挥手;滑动窗口;TCP状态转换;端口复用;TCP心跳检测机制)

前言:建议看着图片,根据文字描述走一遍TCP通讯过程,加深理解。 目录 TCP通信时序: 1)建立连接(三次握手)的过程: 2)数据传输的过程: 3)关闭连…