Redis 有 5 种基础数据结构,分别为:string (字符串)、list (列表)、set (集合)、hash (哈希) 和 zset (有序集合)。
字符串 string 是 Redis 最简单的数据结构。Redis 所有的数据结构都是以唯一的 key 字符串作为名称,然后通过这个唯一 key 值来获取相应的 value 数据。不同类型的数据结构的差异就在于 value 的结构不一样。字符串结构使用非常广泛,一个常见的用途就是缓存用户信息。我们将用户信息结构体使用 JSON 序列化成字符串,然后将序列化后的字符串塞进 Redis 来缓存。同样,取用户信息会经过一次反序列化的过程。
127.0.0.1:6379> set name cb OK 127.0.0.1:6379> get name "cb" 127.0.0.1:6379> EXISTS name (integer) 1 127.0.0.1:6379> DEL name (integer) 1
可以批量对多个字符串进行读写,节省网络耗时开销
127.0.0.1:6379> mget name1 name2 name3 1) "cb" 2) "aj" 3) (nil) 127.0.0.1:6379> mset name1 boy name2 girl name2 uknow OK 127.0.0.1:6379> mget name1 name2 name3 1) "boy" 2) "uknow" 3) (nil)
可以对 key 设置过期时间,到点自动删除,这个功能常用来控制缓存的失效时间
127.0.0.1:6379> get name (nil) 127.0.0.1:6379> set name test OK 127.0.0.1:6379> EXPIRE name 5 (integer) 1 127.0.0.1:6379> get name "test" 127.0.0.1:6379> get name "test" 127.0.0.1:6379> get name (nil) # setex等于set + expire 127.0.0.1:6379> setex name 5 test OK 127.0.0.1:6379> get name "test" 127.0.0.1:6379> get name "test" 127.0.0.1:6379> get name "test" 127.0.0.1:6379> get name (nil) # setnx 如果key已存在就set不成功 127.0.0.1:6379> setnx name test (integer) 1 127.0.0.1:6379> setnx name test1 (integer) 0
如果 value 值是一个整数,还可以对它进行自增操作。自增是有范围的,它的范围是 signed long 的最大最小值,超过了这个值,Redis 会报错
127.0.0.1:6379> set age 20 OK 127.0.0.1:6379> incr age (integer) 21 127.0.0.1:6379> incr age (integer) 22 127.0.0.1:6379> incrby age 10 (integer) 32 127.0.0.1:6379> incrby age -5
Redis 的列表相当于 Java 语言里面的 LinkedList,注意它是链表而不是数组。这意味着 list 的插入和删除操作非常快,时间复杂度为 O(1),但是索引定位很慢,时间复杂度为 O(n),这点让人非常意外。 当列表弹出了最后一个元素之后,该数据结构自动被删除,内存被回收。
Redis 的列表结构常用来做异步队列使用。将需要延后处理的任务结构体序列化成字符串塞进 Redis 的列表,另一个线程从这个列表中轮询数据进行处理。
127.0.0.1:6379> rpush books java python go (integer) 3 127.0.0.1:6379> llen books (integer) 3 127.0.0.1:6379> lpop books "java" 127.0.0.1:6379> lpop books "python" 127.0.0.1:6379> lpop books "go" 127.0.0.1:6379> lpop books (nil)
127.0.0.1:6379> rpush books java python go (integer) 3 127.0.0.1:6379> rpop books "go" 127.0.0.1:6379> rpop books "python" 127.0.0.1:6379> rpop books "java" 127.0.0.1:6379> rpop books (nil)
Redis 的字典相当于 Java 语言里面的 HashMap,它是无序字典。内部实现结构上同 Java 的 HashMap 也是一致的,同样的数组 + 链表二维结构。第一维 hash 的数组位置碰撞时,就会将碰撞的元素使用链表串接起来。
hash 结构也可以用来存储用户信息,不同于字符串一次性需要全部序列化整个对象,hash 可以对 用户结构中的每个字段单独存储。这样当我们需要获取用户信息时可以进行部分获取。而以整个字符串的形式去保存用户信息的话就只能一次性全部读取,这样就会比较浪费网络流量。 hash 也有缺点,hash 结构的存储消耗要高于单个字符串,到底该使用 hash 还是字符串,需要根据实际情况再三权衡。
127.0.0.1:6379> hset books java "think in java" (integer) 1 127.0.0.1:6379> hset books go "concurrency in go" (integer) 1 127.0.0.1:6379> hset books python "python cookbook" (integer) 1 127.0.0.1:6379> hgetall books 1) "java" 2) "think in java" 3) "go" 4) "concurrency in go" 5) "python" 6) "python cookbook" 127.0.0.1:6379> hlen books (integer) 3 127.0.0.1:6379> hget books java "think in java" # 更新操作,结果返回0 127.0.0.1:6379> hset books java "new think in java" (integer) 0 127.0.0.1:6379> hget books java "new think in java"
Redis 的集合相当于 Java 语言里面的 HashSet,它内部的键值对是无序的唯一的。它的内部实现相当于一个特殊的字典,字典中所有的 value 都是一个值NULL。 当集合中最后一个元素移除之后,数据结构自动删除,内存被回收。
127.0.0.1:6379> sadd books java (integer) 1 127.0.0.1:6379> sadd books python (integer) 1 127.0.0.1:6379> sadd books java (integer) 0 127.0.0.1:6379> smembers books 1) "java" 2) "python" 127.0.0.1:6379> sismember books java (integer) 1 127.0.0.1:6379> scard books (integer) 2 127.0.0.1:6379> spop books "python"
zset 似于 Java 的 SortedSet 和 HashMap 的结合体,一方面它是一个 set,保证了内部 value 的唯一性,另一方面它可以给每个 value 赋予一个 score,代表这个 value 的排序权重。
zset 可以用来存粉丝列表,value 值是粉丝的用户 ID,score 是关注时间。我们可以对粉丝列表按关注时间进行排序。 zset 还可以用来存储学生的成绩,value 值是学生的 ID,score 是他的考试成绩。我们可以对成绩按分数进行排序就可以得到他的名次。
127.0.0.1:6379> zadd books 9.0 "think in jvava" (integer) 1 127.0.0.1:6379> zadd books 8.9 "java concurrency" (integer) 1 127.0.0.1:6379> zadd books 8.6 "java cookbook" (integer) 1 127.0.0.1:6379> zrange books 0 -1 1) "java cookbook" 2) "java concurrency" 3) "think in jvava" 127.0.0.1:6379> zrevrange books 0 -1 1) "think in jvava" 2) "java concurrency" 3) "java cookbook" 127.0.0.1:6379> zcard books (integer) 3 127.0.0.1:6379> zscore books "java cookbook" "8.5999999999999996" # 排名 127.0.0.1:6379> zrank books "java concurrency" (integer) 1 127.0.0.1:6379> zrangebyscore books 8.8 9.5 1) "java concurrency" 2) "think in jvava" 127.0.0.1:6379> zrangebyscore books -inf 8.91 withscores 1) "java cookbook" 2) "8.5999999999999996" 3) "java concurrency" 4) "8.9000000000000004" 127.0.0.1:6379> zrem books "java cookbook" (integer) 1 127.0.0.1:6379> zrange books 0 -1 1) "java concurrency" 2) "think in jvava"
用来列出所有满足特定正则字符串规则的key,当redis数据量比较大时,性能比较差,要避免使用
查看redis服务运行信息,分为 9 大块,每个块都有非常多的参数,这 9 个块分别是:
文章浏览阅读1.2w次,点赞4次,收藏40次。打击违法直播 净化网络环境某天,我的一个朋友(这个朋友真不是我自己)发了我一款聚合直播App,大喜过望之后发现需要充值才能继续观看,我这种穷逼哪来的钱充值,所以就有了这次逆向之旅一、反编译用jadx-gui直接打开Apk,发现没有加固,源码如下:二、源码分析1. 打开app,通过adb查看当前activity的名称adb shelldumpsys a...
文章浏览阅读1.8w次,点赞2次,收藏25次。最新9月份饿了么电脑脚本薅羊毛+获取cookie教程+免费代挂,脚本交流,脚本分享,代挂饿了么豆子,免费_饿了么乐园币脚本
文章浏览阅读2.3k次,点赞3次,收藏6次。下载npm install mockjs --save-dev使用1、新建mock.jsimport Mock from 'mockjs'Mock.mock("/getTest",{ "name1|1-3": 'a', "name2|2": 'b',});2、新建vue文件<template> <div> ..._vebn mock
文章浏览阅读5.8k次。解决方法:1、vs2010 项目-> XXX属性-> 配置属性-> 常规-> 字符集 -> “使用unicode字符集” 改为 “未设置” 就去掉了unicode支持;(已经验证过)2、也可以在#include 之前加上一句#undef UNICODE 有时候好像不太管用3、你全部使用 TCHAR替换char字符串常_无法将参数 1 从“wchar [260]”转换为“const char *”
文章浏览阅读1.7k次。从网上找的,已经将用bc写的改成了vc的,由于对音乐的理解比乐盲还差,对于程序中转换是否有问题我也不得而知,反正用vc生成的midi文件听起来惨不忍睹。 对于制作midi音乐来说,比播放midi文件本身更复杂得多。我们得了解..._midi数据结构
文章浏览阅读1k次。客户需求分析:客户全国30个门店通过SDWAN线路访问阿里云服务器。 接入阿里云预计需求是100M带宽,每个门店10M带宽。 Telstra提供全国网络资源实现门店到阿里云的网络连通,搭建稳定可靠的SDWAN网络,客户SDWAN网络主要使用的应理类系统和销售应用系统。 解决方案说明1,客户共有阿里云和30个门店共31个节点的网络需求。2,Te..._4s店 sdwan
文章浏览阅读2.4k次。参考自John Hedengren的一门课,网址是apmonitor.com考虑这样一个反应:要求画出物质A和B的浓度时间曲线。其中A的反应速率如下:k=2.0,B的反应速率为 :代码:import numpy as np from scipy.integrate import odeintimport matplotlib.pyplot as pltdef rxt(C,t): Ca=C[0] Cb=C[1] k=2.0 dAdt = -k*Ca d._化学反应的常微分方程求解
文章浏览阅读1.9k次。前置条件安装Go下载对应安装包并安装。下载地址安装Node下载安装,如此便有了npm。下载地址安装GCC库Windows下需要安装GCC库用来编译。下载地址安装wailsgo get github.com/wailsapp/wails/cmd/wails wails初始设置wails setup 设置 用户名 和邮箱wails init 初始化一个项目 分别输入- 项目名称- 二进制名称- 文件夹名称完成之后就能运行 build 里面exe文件完美运行..._wails 下载地址
文章浏览阅读179次。目录一 树上差分:二 tarjan算法求割边三tarjan求割点四 康托展开 五 后缀数组模板:六 后缀自动机模板:七 求最大子矩阵八 异或空间,线性基九 极大团(回溯法 剪枝)十 斯坦纳树 求给定点的最小联通代价十一 FFT(多项式乘法)十二 NTT十三回文树(统计回文串的数量)十四广义后缀自动机十五 欧拉回路十..._若x是搜索树的根节点,则x是割点当且仅当搜索树上存在至少两个子节点
文章浏览阅读434次。数据结构实验之链表七:单链表中重复元素的删除Time Limit: 1000MS Memory Limit: 65536KBProblem Description按照数据输入的相反顺序(逆位序)建立一个单链表,并将单链表中重复的元素删除(值相同的元素只保留最后输入的一个)。Input第一行输入元素个数 n (1 第二行输入 n 个整数,保证在 int 范_2122数据结构式
文章浏览阅读1k次。桌面运维的工作非常繁杂,在完成日程工作以外还要应对各种突发事件。该职业要求具有极高的响应能力,以便快速的解决故障以保证它人的工作可以顺利进行。对于从事桌面运维的工程师来说,具备高度的计算机理论知识和和一些运维工具是必不可少的。而运维人员可能遇到以下一些问题,IT管理员常用的管理,运维工具有哪些计算机维护常用软件有哪些电脑桌面运维工程师需要做些什么?常用电脑维修工具都有那些?运维人员必备工具教程..._1.计算机维修与维护常用的工具有哪些? (最少写 五个)
文章浏览阅读1.1w次,点赞7次,收藏20次。背景业务功能的需要,要求要去生产一个带有数据校验的导入模板。了解工具XSSFDataValidationConstraint(XSSF数据有效性验证约束):创建约束的时候,可以指定数据类型,以及数据列。例如:String strFormula = hiddenSheetName + "!$"+colStr+"$1:$"+colStr+"$65535"; XSSFDataValidationConstraint constraint = new XSSFDat_xssfdatavalidationconstraint