redis再战之value数据类型实操《三》

c# 获取redis中所有的value 通过上述代码,可安全高效地获取 Redis 中所有键的值,并根据需要扩展对不同数据类型的支持。// 使用 SCAN 分页遍历键(避免 KEYS * 的性能问题)// 仅获取字符串类型的值(按需扩展其他类型)/// 安全获取所有键的值(分页扫描模式,避免阻塞 Redis)/// 高性能批量获取字符串值(Pipeline 优化):全量扫描操作(即使分页)仍可能影响性能,建议在低峰期执行。分页遍历键,减少对 Redis 的阻塞风险。// 方法2:批量获取指定键。// 方法1:安全分页扫描。 阅读详情

string

  • redis-cli help
    redis默认共有16个库,可以在配置文件中修改
    在这里插入图片描述
set k380 hello
get k380
help @generic
keys *
#清库,慎用,my friend
flushdb
flushall
 
help@string
#不存在的时候才去设置,一旦有设置,则新的设置无效(只能新建)
set k1 ooxx nx
#存在的时候才去设置,一旦没有设置,则新的设置无效(只能更新)
set k2 hello xx
#批量
mset k3 a k4 b
mget k3 k4
 
append k1 world
#正反向索引
getrange k1 5 -1
setrange k1 5 " xiaowu"
 
strlen k1
#查看k1的value类型
type k1
 
set k2 99
type k2
 
object help
#面向字符串可以有计算类型,这里的int指的是k2的value的编码类型而不是type
object encoding k2
#加减
incrby k2 12
decr k2
decrby k2 22
incrbyfloat k2 0.5
#2中类型,embstr,row
set k3 jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj
object encoding k3
append k3 jjjjjjj
object encoding k3
 
flushall
#二进制安全演示
set k1 hello
strlen k1
set k2 9
object encoding k2
strlen k2
append k2 999
get k2
object encoding k2
incr k2
object encoding k2
strlen k2
#utf-8和gbk编码
set k3 a
get k3
strlen k3
append k3 中
get k3
strlen k3
#触发格式化操作,"中"字可以正常显示
redis-cli --raw
#原子性操作
msetnx k1 a k2 b
mget k1 k2
msetnx k2 c k3 d
mget k1 k2 k3
 
flushall
#一个字节8位
help setbit
setbit k1 1 1
strlen k1
setbit k1 7 1
#01000001
setbit k1 9 1
strlen k1
get k1
#就算是只找第二个字节,依然会返回全量字节的索引下标
help bitpos
bitpos k1 1 0 0
bitpos k1 1 1 1
bitpos k1 1 0 1
#统计次数
bitcount k1 1 0 1
 
flushall
#位操作,与或非
setbit k1 1 1
setbit k1 7 1
get k1
setbit k2 1 1
setbit k2 6 1
#与操作 有0则0,全1为1
#01000000
bittop and andkey k1 k2
#或操作 有1则1,全0为0
#01000011
bittop or orkey k1 k2

list

help @list
#向k1中添加
lpush k1 a b c d e f
#l代表左边,插入的结构实际为f e d c b a
 
rpush k2 a b c d e f
#r代表右边,插入的结构实际为a b c d e f
#弹出元素
lpop k1
#这个东西与栈类似
#弹出元素
rpop k1
#栈:同向命令
#队列:反向命令
#查看
lrange k1 0 -1
#根据下标取
lindex k1 2
lindex k1 -1
#根据下标设置
lset k1 3 xxxx
#删除
lrem k3 2 a
#2为正数代表正向删除,为负数代表反向删除
 
linsert k3 after 6 a
#在元素6之后插入,而不是下标了
#如果有两个相同元素,会在第一个元素6之后插入,而不是两个6全插入
 
linsert k3 before 3 a
#反向删除
lrem k3 -2 a
#统计数量
llen k3
#开三个客户端测试阻塞
blpop ooxx 0
#两个客户端阻塞,一个客户端新增数据,有机会测一下
#两端删除
ltrim k4 0 -1
ltrim k4 2 -2
#从下标2开始到下标-2留下,也就是说下标0,1,-1删除

在这里插入图片描述

help @list

#向k1中添加
lpush k1 a b c d e f
#l代表左边,插入的结构实际为f e d c b a

rpush k2 a b c d e f
#r代表右边,插入的结构实际为a b c d e f

#弹出元素
lpop k1
#这个东西与栈类似

#弹出元素
rpop k1
#栈:同向命令
#队列:反向命令

#查看
lrange k1 0 -1

#根据下标取
lindex k1 2
lindex k1 -1

#根据下标设置
lset k1 3 xxxx

#删除
lrem k3 2 a
#2为正数代表正向删除,为负数代表反向删除

linsert k3 after 6 a
#在元素6之后插入,而不是下标了
#如果有两个相同元素,会在第一个元素6之后插入,而不是两个6全插入

linsert k3 before 3 a

#反向删除
lrem k3 -2 a

#统计数量
llen k3

#开三个客户端测试阻塞
blpop ooxx 0
#两个客户端阻塞,一个客户端新增数据,有机会测一下

#两端删除
ltrim k4 0 -1
ltrim k4 2 -2
#从下标2开始到下标-2留下,也就是说下标0,1,-1删除

在这里插入图片描述

map

set sean::name 'minato aqua'
get sean::name 
set sean::age 18
get sean::age
keys sean*

hset sean name 'minato aqua'
hmset sean age 18 address hovelive

hget sean name
hget sean address
hmget sean name age
hkeys sean
hvals sean
hgetall sean

hincrbyfloat sean age 0.5
hincrbyfloat sean age -1
#hashmap应用场景:收藏,详情页,点赞,修改数据等等

Set

在这里插入图片描述

#set特点:无序+去重
help @set
sadd k1 tom sean peter ooxx tom xxoo
smembers k1
srem k1 xxoo ooxx
smembers k1

sadd k2 1 2 3 4 5
sadd k3 4 5 6 7 8

sinter k2 k3

#插入到dest里头
sinterstore dest k2 k3

sunion k2 k3
#同上,存在rstore,并集

sdiff k2 k3
sdiff k3 k2
#外差集,两个结果并不一样,右侧为参考基准

srandmember k1 5 -5 10 -10
#为正数的时候,取出一个去重的结果集(不能超过已有结果集)
#为负数的时候,取出一个带重复的结果集(一定会满足你要的数量)
#为0,不返回结果

spop k1

Sort Set

在这里插入图片描述

#想让它们怎么排序?名称?大小?价格?
help @sorted_set
 
zadd k1 8 apple 2 banana 3 orange
#物理内存左小右大,不随命令发生变化
#查看
zrange k1 0 -1
#查看分值
zrange k1 0 -1 withscores
#取分值范围
zrangebyscore k1 3 8
#正向取
zrange k1 0 1
#反向取
zrevrange k1 0 1
#通过值取分值
zscore k1 apple
#取出排名
zrank k1 apple
#查看所有
zrange k1 0 -1 withscores
#增加
zinsrby k1 2.5 banana
#实时根据修改更新排序
zrange k1 0 -1 withscores
#集合取并集
zadd k1 80 tom 60 sean 70 baby
zadd k2 60 tom 100 sean 40 yiming
zunionstore unkey 2 k1 k2
zrange unkey 0 -1 withscores
#设置权重
zunionstore unkey1 2 k1 k2 weights 1 0.5
#k1里面的不变,k2里面的乘0.5
zrange unkey1 0 -1 withscores
#取最大的
zunionstore unkey2 2 k1 k2 aggregate max
zrange unkey2 0 -1 withscores

排序是怎么实现的怎删改查的速度?

跳跃表(skip list),平衡树
在这里插入图片描述

  • 随机造层,最大层数是16层
package com.example.demo;
 
import java.util.Random;
 
/**
 * 跳表的实现
 */
public class SkipList {
    public static final int MAX_LEVEL = 16; //跳表所允许的最大层级
    private SkipListNode head = new SkipListNode(null, MAX_LEVEL);
    private Random random = new Random();
    private int usedLevel = 1; //当前跳表使用中的最大层级
 
    public void insert(int value) {
        int level = randomLevel(); //找出当前插入值随机最大层数
        //遍历节点并插入
        insert(value, level);
 
    }
 
    public void delete(int value) {
        //从最高层开始,寻找节点
        int level = usedLevel;
        while(level >= 1) {
            level--;
            SkipListNode searchResult = search(value, level);
            if(searchResult != null) {
                deleteNode(searchResult);
                break;
            }
        }
 
    }
 
    //逐层打印
    public void print() {
       int level = usedLevel;
       while(level >= 1) {
           level--;
           printLevel(level);
       }
    }
 
    private void printLevel(int level) {
        SkipListNode current = head;
        String result = new String();
        while (current.next[level] != null) {
            result = result + current.next[level].data + " -> ";
            current = current.next[level];
        }
        System.out.println("第 " + level + " 层的数据为 : " + result);
    }
 
    private void deleteNode(SkipListNode searchResult) {
        //将当前节点的前置节点和后置节点关联起来即可
        int currentLevel = searchResult.getMaxlevel();
        while(currentLevel >= 1) {
            currentLevel--;
            //当前节点的前置节点的后置节点 = 当前节点的后置节点
            searchResult.pre[currentLevel].next[currentLevel] = searchResult.next[currentLevel];
            if(searchResult.next[currentLevel] != null) {
                //如果当前节点的后置节点不为null
                //当前节点的额后置节点的前置节点 = 当前节点的前置节点
                searchResult.next[currentLevel].pre[currentLevel] = searchResult.pre[currentLevel];
            }
        }
    }
 
    private SkipListNode search(int value, int level) {
        //从头开始遍历
        SkipListNode current = head;
        while(current.next[level] != null && current.next[level].data < value) {
            current = current.next[level];
        }
        if(current.next[level] == null || current.next[level].data != value) {
            //如果搜索到最后,或者已经搜索到比寻找值大的节点了
            return null;
        }
        return current.next[level];
 
    }
 
    private void insert(int value, int level) {
        SkipListNode node = new SkipListNode(value, level); //构造当前节点
        int currentLevel = level;
        while(currentLevel-- > 0) {
            //从最高层开始,遍历每一层
            if(head.next[currentLevel] == null) {
                //如果当前没有插入任何元素,直接插入即可
                head.next[currentLevel] = node;
                node.pre[currentLevel] = head;
            } else {
                SkipListNode current = head.next[currentLevel], pre = head;
                //从第一个元素开始遍历
                while(current != null && current.data < value) {
                    pre = current;
                    current = current.next[currentLevel];
                }
                //设置前置节点的后置节点为当前节点
                pre.next[currentLevel] = node;
                node.pre[currentLevel] = pre;
                if(current != null) {
                    //如果没有遍历到结尾,则需要设置当前节点的前置节点
                    current.pre[currentLevel] = node;
                    node.next[currentLevel] = current;
                }
            }
 
        }
        usedLevel = usedLevel > level ? usedLevel : level;
    }
 
    //随机生成函数,即对于任意一个要插入跳表的节点,它的层级为多少
    private int randomLevel() {
        int level = 1;
        for(int i = 1; i < MAX_LEVEL; i++) {
            if(random.nextInt() % 2 == 1) {
                level++;
            }
        }
        return level;
    }
 
 
    private class SkipListNode{
        private Integer data;
        private SkipListNode[] next; //后置节点
        private SkipListNode[] pre; //前置节点,方便删除使用
 
        public SkipListNode(Integer data, int maxLevel) {
            this.data = data;
            next = new SkipListNode[maxLevel];
            pre = new SkipListNode[maxLevel];
        }
 
        int getMaxlevel() {
            return next.length;
        }
 
    }
 
    public static void main(String[] args) {
        SkipList skipList = new SkipList();
        skipList.insert(10);
        skipList.insert(25);
        skipList.insert(83);
        skipList.insert(20);
        skipList.print();
        System.out.println("------------------");
        skipList.delete(83);
        skipList.delete(20);
        skipList.print();
 
    }
}
告别死记硬背!用实际案例带你玩转UE5编辑器界面(附场景搭建练习) 本文通过实际案例教学,带你轻松掌握Unreal Engine5编辑器界面的核心功能。从创建基础场景到添加光源和可交互对象,逐步讲解内容浏览器、模式面板、世界大纲等模块的协同工作方式,告别死记硬背的学习模式。附场景搭建练习,助你快速上手UE5开发。 阅读详情

相关推荐

第二十一篇: `man`, `tldr`, `explain` - 授人以渔的“终极指令”

我们已经一起学习了19个(组)关键命令,从nvidia-smi到kubectl。但这只是GPU运维武器库中的一小部分。技术日新月异,新的工具、新的参数会不断涌现。这个系列的真正目的,不仅是教会你使用这19件“兵器”,更是希望你掌握学习任何一件新兵器的方法论。这套方法论就是你的“终极指令”。授人以鱼不如授人以渔。至此,《GPU运维指令集:20个关键命令的战地手册》系列已全部完结。我们从nvidia-smi出发,一路探索了监控、诊断、容器、集群、网络、性能等各个维度的命令,最后用自动化脚本将它们串联,又用。

weixin_42587823的博客 1350

Redis学习笔记整理_01

redis 数据类型,简单的特性

weixin_42547014的博客 549

Qt开发中彻底解决中文乱码问题

中文乱码问题主要源于编码不一致需要同时设置控制台和Qt应用程序的编码确保项目文件和环境配置的编码一致文件操作时注意指定正确的编码。

qq_53832058的博客 3403

redis保存数据的几种类型

redis保存数据时都有key和value,key和value要么是String类型的,要么是byte[]类型的。在此都是讲的String类型的,所用的jar主要有: commons-pool-1.6.jar jedis-2.1.0.jar 1.保存数据之String 要把一个String保存到redis中,用set(key,value),获取值用get(key) 2.保存数据之Li

yunsyz的专栏 3万+

检索增强世界模型(R-WoM)原理与应用实践

世界模型是AI系统理解环境的核心技术,通过构建环境的内部表示实现状态预测和行动规划。传统方法基于RNN或VAE等神经网络,而检索增强世界模型(R-WoM)创新性地引入检索机制,结合外部记忆库提升系统性能。这种架构突破模型参数限制,使AI能像人类一样利用历史经验解决问题,在游戏AI、虚拟助手等场景表现优异。关键技术包括FAISS相似性搜索、分层记忆管理和动态检索策略,其中Transformer编码器和GRU动态模型的组合实现高效环境建模。实践表明,该方法可提升47%的战术多样性,加快32%的应急响应速度。

weixin_42676876的博客 341

瑞萨RZN2L工业以太网开发避坑指南:EtherCAT从入门到通信调试全流程

本文详细解析了瑞萨RZN2L MPU在工业以太网开发中的EtherCAT从站配置与通信优化全流程。通过硬件设计关键点、协议栈选型、PDO映射策略及DC同步精度优化等实战技巧,帮助开发者快速搭建高效通信框架并解决调试中的常见问题,特别适合工业自动化领域的实时通信需求。

aitie1479的博客 458

Redis(一)中的value类型

redis数据类型

zql1455890112的博客 841

PySide6多线程避坑大全:信号槽崩溃、内存泄漏,这些雷我都帮你踩过了

本文深入探讨了PySide6多线程开发中的常见问题与解决方案,包括信号槽崩溃、内存泄漏等典型陷阱。通过实战案例和优化策略,帮助开发者避免UI线程操作错误、有效管理资源生命周期,并提升跨线程通信的可靠性。特别针对PySide6多线程特性,提供了线程安全日志、死锁检测等实用调试技巧。

weixin_32288959的博客 396

Redis可以做哪些事?

都知道redis有五种数据结构,你知道这五种数据结构的使用场景吗?

Java旅途 1647

CloudCompare 二次开发(35)——提取多条直线

使用CloudCompare与PCL编程实现的多条空间直线的提取。

点云侠的博客 436

Open3D点云数据处理(二):读写点云,你真的会吗?

本文详细介绍了open3d加载点云、保存点云的方法,同时打印点云坐标、颜色、法向量等字段信息。

孙悟空 2604

Redis中key-value对value的数据类型

文章目录第1章 string(字符串)1.1 相关命令1.2 相关实践 第1章 string(字符串) 字符串就是由多个字符组成的,用双引号引起来。每个字符它是有序的,不会自动去重的。字符串中的每个字符是有相应下标的【从左往右是从0开始,没有从右往左这种操作(python中的字符串有这种操作)】,既然字符串中的每个字符有相应的下标,那么是可以根据字符的下标进行字符的更改。最大容量512M。 1.1 相关命令 ##### 通过(不只是针对string) exists # 判断单个key或多个key是否存在

chenliang 2862

YOLO26-seg分割优化:卷积魔改 | 动态蛇形卷积(Dynamic Snake Convolution),实现暴力涨点 | ICCV2023

​​​​​​摘要:本研究对Ultralytics YOLO26进行了全面分析,重点阐述了其关键架构改进及其在实时边缘目标检测中的性能基准测试。YOLO26于2025年9月发布,是YOLO系列最新、最先进的成员,专为在边缘及低功耗设备上实现高效、精确且易于部署的目标而构建。本文依次详述了YOLO26的架构创新,包括:移除了分布焦点损失(DFL);采用端到端的无NMS推理;集成了渐进损失(ProgLoss)与小目标感知标签分配(STAL);以及引入了用于稳定收敛的MuSGD优化器。

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 214

Redis常用数据类型命令行实操

Redis命令行操作 一、基本操作 1、select切换库,默认是0号库(共16个库) 127.0.0.1:6379> select 1 #切换1号库 2、dbsize查看数据库长度(数据库中存放多少数据) 127.0.0.1:6379> dbsize (integer) 3 二、key操作 1、查找符合格式的key 127.0.0.1:6379> key * #查看所有的key,等同于show tables; 127.0.0.1:6379> key a??? #查

weixin_49057491的博客 1267

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Redis(二)value 的五种常见数据类型简述

Redis 键值对结构中的 value 有它们分别是:string(字符串)、list(列表)、hash(哈希)、set(集合)、zset(有序集合),这里对五个数据结构进行简介,后文我们会对每个数据类型详细介绍。

m0_73682725的博客 1204

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Redis数据类型

Redis介绍 RedisObject的结构 1. type 2. enconding 3. lru 4. refcount 5. *prt Redis源码结构 1. 基本数据结构 2. Redis数据类型的底层实现 3. Redis数据库的实现 4. Redis服务端和客户端实现 5. 其他 Redis数据类型 String List Set Zset Hash Stream Bloom Filter Bitmap HyperLogLog Geospatial 使用场景 使用示例

骑个小蜗牛的博客 5157

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Redis 的 Key 和 Value 设计原则

在使用 Redis 时,合理设计 Key 和 Value 至关重要。

m0_57836225的博客 1564

redis查看所有的key和value

使用 Redis 查看所有的 Key 和 Value 在开发中,数据的快速访问和操作是至关重要的,Redis 是一个高性能的键值数据库,可以高效地存储和获取数据。如果你是刚入行的小白,想要查看 Redis 中的所有键(key)及其对应的值(value),本文将为你详细讲解整个过程。 流程概览 为了方便理解,我们将整个过程分...

weixin_41030697的博客 4743

redis查看所有key和value_Redis介绍和数据类型及单机版安装

Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库。Redis 与其他 key - value 缓存产品有以下三个特点:Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。Redis支持数据的备份,即mas...

weixin_39900286的博客 1万+

redis一键获取value

redis获取value redis一共有五种数据类型,如下 数据类型 写入方式 查询方式 string(字符串) set key value get key hash(哈希) hmset key value1 value2 hgetall key list(列表) lpush key value lrange 0 -1 set(集合) sadd key value smemgers key zset(有序集合) zadd key 1 value zrange 0 -1

qq_43320714的博客 3420

Redis-结构化value对象的类型

Redis常用的value包含5种类型:string、list、set、map、sorted-set//":4"表示占用4位void *ptr;} robj;type:指这些结构化类型encoding:指的是这些结构化类型在具体的实现(承载)方式,同一个类型可以有多种实现,例如String可以用int来承载,也可用用封装的char[]来承载,List可用ziplist或者链表来承载;lru:表示本对象的空转时长,用于有限内存下长久不访问的对象的清理;

sq2048935747@163.com的博客 1415

[Spring][Redis]@Cacheable与redis整合时Value和Key的理解

更新于2019年11/08: 首先, 多谢CHENFU_ZKK同学指出我的错误. 卧槽,吓我一跳,我还以为我以前学的搞错了。若不是我亲自测试一遍,差点信你了 这两天趁有空, 跟踪了@Cacheable相关的源码再次确认结果如下: 1) 直接使用Spring的@Cacheable注解, 则调用的redis的set函数, 那么生成的Key为value和name俩个字符串通过::进行连接. ...

中年油腻男人的转型之路 1万+

Redis的Key和Value的设计原则有哪些?

Redis的Key和Value的设计原则有哪些?

java1234的博客 911

Redis 数据类型

2、充分利用Set类型的服务端聚合操作方便、高效的特性,可以用于维护数据对象之间的关联关系。比如所有购买某–电子设备的客户ID被存储在一个指定的Set中,而购买另外一种电子产品的客户ID被存储在另外一个Set中,如果此时我们想获取有哪些客户同时购买了这两种商品时,Set的intersections 命令就可以充分发挥它的方便和效率的优势了。redis无论什么数据类型,在数据库中都是以key-value形式保存,并且所有的key(键)都是字符串,所以讨论基础数据结构都是讨论的value值的数据类型。

fhjtg的博客 1713

【redis】2、Redis的Value的常见数据类型以及使用场景

本文介绍了redis的数据结构以及value常见的数据类型,包括基本使用、使用场景以及底层的数据结构实现

会飞的猴儿 934

Redis底层存储结构三---Redis中Key-Value中的Value

Redis底层存储结构三---Redis中Key-Value中的Value1、string1.1、int1.2、embstr1.3、raw2、 我们都只知道,在我们的Redis中,最常用的Value数据结构有5个,string、list、hash、set、zset,但是这五个在内存中的存储还是有一些变化的,接下来逐个的介绍一下这几个 1、string 对于string形式,我们Redis底层在内存中的存储是由三种结构的,这三种结构分别是int,embstr,raw。 在上一篇博客中我们讲到了真正存储V

qq_41931364的博客 1314
上一篇: redis再战之IO网络传输演变与区别《二》
下一篇: redis再战之进阶消息订阅,事务,缓存《四》
漂吧
博客等级 码龄8年 15粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值