redis 5种数据结构适用场景

news2024/11/24 0:32:40

网上介绍太笼统了,呕心沥血整理出来的可理解的适用场景,查看下图

redis-cli指令大全:点击查看redis指令

Redis支持5种数据类型:

  1. string(字符串)

  1. hash(哈希)

  1. list(列表)

  1. set(集合)

  1. zset(sorted set:有序集合)

string是 redis 最基本的类型,一个 key 对应一个 value。value其实不仅是String,也可以是数字。

使用场景:常规key-value缓存应用。常规计数(incr): 微博数, 粉丝数,点赞数等

常用命令set,get incr,incrby,decrby,del


hash 是一个键值(key => value)对集合。特别适合存储对象。

要存储一个用户信息对象数据,包含以下信息:

用户ID为查找的key,存储的value用户对象包含姓名,年龄,生日等信息,如果用普通的key/value结构来存储,

通常我们会选择以下两种方式:

第一种方式将用户ID作为查找key,把其他信息封装成一个对象以序列化的方式存储,这种方式的缺点是,增加了序列化/反序列化的开销,并且在需要修改其中一项信息时,需要把整个对象取回,并且修改操作需要对并发进行保护,引入CAS等复杂问题。

第二种方法是这个用户信息对象有多少成员就存成多少个key-value对儿,用用户ID+对应属性的名称作为唯一标识来取得对应属性的值,虽然省去了序列化开销和并发问题,但是用户ID为重复存储,如果存在大量这样的数据,内存浪费还是非常可观的。

常用命令:

hset,hget,mset , mget

books对象 name ,page,monty作为属性和key

hset,hget适用于属性信息存储,mset,mget 一次设置多个key

hash是否可以单独修改指定属性呢?可以的,直接再次存储即可

如何快速删除key呢?

hgetall取出来的数据结构是什么,怎么取数据?map[string]string

func HsetGet(conn redis.Conn){
    key := "abc"
    _, err := conn.Do("hset", "books", key, "1") //books是哈希表名 其中存的是一条条key-value
    if err != nil {
        fmt.Printf("set failed:%s", err)
        return
    }
    _, err = conn.Do("hset", "books", "efg", "2") //books是哈希表名 其中存的是一条条key-value
    if err != nil {
        fmt.Printf("-----set failed:%s", err)
        return
    }
    // 取单个值
    data, err := redis.String(conn.Do("hget", "books", key)) //books是哈希表名 其中存的是一条条key-value
    if err != nil {
        fmt.Printf("get failed, err:%v", err)
        return
    }
    fmt.Printf("HsetGet key:%s value:%s \n", key, data)
    // 取全部值
    all, err := redis.StringMap(conn.Do("hgetall", "books")) //books是哈希表名 其中存的是一条条key-value
    if err != nil {
        fmt.Printf("get failed, err:%v", err)
        return
    }
    fmt.Println("all.abc ",all["abc"])

    allByte ,_:= json.Marshal(all)
    fmt.Println(string(allByte))
    var result = make(map[string]string,0)
    json.Unmarshal(allByte,&result)
    fmt.Println(result["page"])
    for k,v := range result {
        fmt.Println("k:",k,"v:",v)
    }
    redis.StringMap(conn.Do("del", "books"))  // 删除key

}

list列表是简单的字符串列表,按照插入顺序排序。

应用场景:Redis list的应用场景非常多,也是Redis最重要的数据结构之一,比如twitter的关注列表,粉丝列表等都可以用Redis的list结构来实现,通过lpush往列表里插入新元素,然后通过lrange命令读取最新元素列表,如朋友圈点赞、评论列表。

点对点的简单消息队列应用(lpop 和lpush 实现)

定时计算的排行榜,lrage可以用取数据。非定时的话,数据会多一些需要排序。

常用指令:lpush:左入队,lpop

如何一次性取出所有数据?如何删除数据?

用lrange取出,数据结构是数组

del key即可删除list列表

import (
    "encoding/json"
    "runtime"
    "testing"
    "time"
    //"github.com/go-redis/redis"  这个包是首选
    "github.com/garyburd/redigo/redis"
    "fmt"
)

func  main(){
db := &redis.Pool{
        MaxIdle:     1,
        MaxActive:   3,
        IdleTimeout: 4 * time.Second,
        Dial: func() (redis.Conn, error) {
            c, err := redis.DialURL("redis://192.168.1.201:6379/10")
            if err != nil {
                fmt.Printf("redis connection error: %v \n", err)
                return nil, fmt.Errorf("redis connection error: %s", err)
            }
            return c, err
        },
        TestOnBorrow: func(c redis.Conn, t time.Time) error {
            _, err := c.Do("PING")
            if err != nil {
                fmt.Printf("ping redis error: %v \n", err)
                return fmt.Errorf("ping redis error: %v", err)
            }
            return nil
        },
    }
    c := db.Get()
    defer c.Close()
     List(c)
}

func List(conn redis.Conn){
    _, err := conn.Do("del", "book_stack" ) //左边进 第二个参数book_lsit是队列名
    if err != nil {
        fmt.Printf("del set failed:%s \n", err)
        return
    }

    _, err = conn.Do("lpush", "book_stack", 1, 2,3,4,5) //左边进 第二个参数book_lsit是队列名
    if err != nil {
        fmt.Printf("List set failed:%s \n", err)
        return
    }

    data, err := redis.String(conn.Do("lpop", "book_stack")) //左边出,一次只能出队一个元素
    if err != nil {
        fmt.Printf("List get failed, err:%v \n", err)
        return
    }
    fmt.Printf("data  value:%s \n", data)
    lrange, err := redis.Int64s(conn.Do("lrange", "book_stack", 0,-1) )//左边出,一次只能出队一个元素
    if err != nil {
        fmt.Printf("List get failed, err:%v \n", err)
        return
    }
    for k,v := range lrange {
        fmt.Println("k:",k,"v:",v)
    }
    fmt.Printf("lrange  value:%v \n", lrange)
}

set是string类型的无序不重合集合。 set 数据有序?纯数字的一般是有序的,其他的确实是无序,所以整体是无序。数据类型是interface,可以同时添加不同类型数据

127.0.0.1:6379[10]> sadd gg 20 200 60 600 qq oo pp aa ss
(integer) 4
127.0.0.1:6379[10]> smembers gg
1) "3"
2) "20"
3) "200"
4) "2"
5) "oo"
6) "pp"
7) "qq"
8) "ss"
9) "4"
10) "60"
11) "aa"
12) "600"
13) "1"

集合是通过hashtable实现的,概念和数学中个的集合基本类似,可以交集,并集,差集等等,set中的元素是没有顺序的。所以添加,删除,查找的复杂度都是O(1)。

常用命令: sadd(添加多个),smembers(获取数据),scard(元素数量),srem(移除一个或多个元素),Sismember (判断成员元素是否是集合的成员),Sscan (命令用于迭代集合键中的元素)。

Sinter 命令返回给定所有给定集合的交集。 不存在的集合 key 被视为空集。 当给定集合当中有一个空集时,结果也为空集(根据集合运算定律)。 sinter key1 ke2 ...

如何直接判断元素在set集合内是否存在?而不是遍历去查看

sismember key xxx(元素)

场景:用户关注的人,用户的粉丝,共同好友,共同关注,共同爱好,微信抽奖小程序

微信微博点赞,收藏、标签。详细的使用快点这里呀 点击查看呀

更多指令参考这里:点击查看redis指令


zset和 set 一样也是string类型元素的集合,且不允许重复的成员。 *zadd 命令:*添加元素到集合,元素在集合中存在则更新对应score。 常用命令:zadd,zrange,zrem,zcard等

不同的是每个元素都会关联一个double类型的分数。Redis正是通过分数来为集合中的成员进行从小到大的排序。zset的成员是唯一的,但分数(score)却可以重复。

使用场景:Redis sorted set的使用场景与set类似,区别是set不是自动有序的,而sorted set可以通过用户额外提供一个优先级(score)的参数来为成员排序,并且是插入有序的,即自动排序。

使用场景:微信步数排行榜、玩家游戏排行榜、成绩单排名。

更多使用场景,查看这里,真的很详细。https://www.jianshu.com/p/f00128af8dbf

go redis相关使用代码示例,跳转这里

参考链接:

https://blog.csdn.net/ckckckcckckc/article/details/127727334

http://t.zoukankan.com/forever521Lee-p-9494951.html

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

飞行类手册国际标准简介

在业界有这个说法:三流的企业卖产品,二流的企业卖技术,一流的企业卖标准。一流企业是行业的标杆,行业的制定者。现在标准已经成为最重要的行业发展因素,谁的产品标准一旦为世界所认同,谁就会引领整个产业的…

指针进阶(C语言)

目录 字符指针 使用方法: 1、指向字符 2、指向字符串的首地址 指针数组 数组指针 数组指针的定义 数组名表示的含义 数组指针的使用 数组参数、指针参数 一位数组传参 二维数组传参 一级指针传参 二级指针传参 函数指针 函数指针数组 指向函数指针数组的指针 回调函…

网站让百度收录的技巧有哪些?网站在百度收录情况怎么查询

同样都是新上线的站点,为什么有的人是秒收,有的人可能要等很多时间才能收录,其实这些都是有技巧加快百度收录我们网站的。网站让百度收录的技巧有哪些?1、上线之前做好网站内容 我们在上线之前一定要做好充足的准备,这…

浏览器控制台接口学习

我们在做项目开发时,想知道一个功能调用了后台哪个接口,我们就可以在浏览器控制台中进行查看。 举一个例子,我们在看博客时,发现这一篇文章写的不错,我们在做点赞这个动作时,调用了哪个接口呢? …

linux 内存恒等映射

目录 arm64内存管理 恒等映射 页表定义,采用4级分页模型 创建页表 内存属性 从进程角度看,需要内存的地方 1、进程本身,代码段、数据段用来存储程序本身需要的数据 2、栈空间:用来保存函数调用关系、局部变量、函数参数、函…

在centos系统上安装mongodb数据库

在centos系统上安装mongodb数据库 本文章基于centos8系统; 如何查看当前系统是centos的那个版本 终端输入命令 cat /etc/redhat-release 开始安装官网当前的数据库版本6.0; 查看官方文档 创建 mongodb yum 源头,写入基本信息 vim /etc/yum.repos.d/mongodb-org-6.0.repo [mon…

手把手教你如何创建和美化图表,老板直接给我升职!

一图胜千言。说到图表,想必很多人都被网上酷炫的图表震惊过。比如下面这样的可视化图表,看起来,很高大上有没有。但是,拆解开来,就是由一个个基础图表演变而来的。所以可不要小瞧了基础图表的制作。今天我就教你如何用…

使用ORM方式查询Mongodb里的数据,再也不用记Mongodb的语法(ORM Bee)

使用ORM方式查询Mongodb里的数据,再也不用记Mongodb的语法(ORM Bee)Mongodb的语法可读性差,要写复杂查询,要求技术能力高;Java驱动,还要使用另一种语法;学习成本太高了。可以使用ORM方式,轻松搞…

【redis6】第三章(五大常用数据类型)

redis命令列表&#xff1a;http://www.redis.cn/commands.html Redis键 set < key >< value >添加键值对 [rootlocalhost ~]# cd /usr/local/bin [rootlocalhost bin]# redis-server /etc/redis.conf [rootlocalhost bin]# redis-cli 127.0.0.1:6379> set k1 a…

电脑怎么恢复出厂设置?Win10系统恢复出厂设置的方法

电脑经常出现报错的情况&#xff0c;而且还有运行缓慢、卡顿的问题&#xff0c;这代表你的电脑可能出现了老化。想要恢复正常&#xff0c;你可以选择把电脑恢复到出厂设置&#xff0c;从而恢复到原始状态。电脑怎么恢复出厂设置&#xff1f;下面以Win10系统电脑为例&#xff0c…

CTK Plugin Framework插件框架学习--插件通信【事件监听】

文章目录一、前言二、事件三、类通信3.1、新建接收插件3.2、新建发送插件3.3、启用插件四、信号槽通信4.1、新建接收插件4.2、新建发送插件4.3、启用插件五、类通信和信号槽通信的区别六、插件依赖七、获取元数据一、前言 CTK框架中的事件监听&#xff0c;其实就是观察者模式&…

Dolphin Streaming实时计算,助力商家端算法第二增长曲线

丨目录&#xff1a;1.背景2.业务问题3.业界解决方案4.技术方案5.应用示例6.业务收益7.总结1. 背景随着业务朝向精细化经营增长&#xff0c;阿里妈妈商家端营销产品更加聚焦客户投放体验&#xff0c;旨在帮助商家提升经营效果&#xff0c;在变化的市场中找到确定增长。近年来&am…

【OpenGL学习】OpenGL介绍

一、OpenGL是什么&#xff1f; 在早期一般认为OpenGL是一个API(Application Programming Interface, 应用程序编程接口)&#xff0c;包含了一系列可以操作图形、图像的函数。然而&#xff0c;OpenGL本身并不是一个API&#xff0c;它仅仅是一个由Khronos组织制定并维护的规范(S…

商城模式“分享购”意味着什么?关键逻辑是什么?

商城模式“分享购”近期炽手可热的卖家打赏模式电子商务平台&#xff0c;根据申请注册交易赠予贡献度&#xff0c;推动者每日权重计算分派领到固定不动积分兑换数量空投物资&#xff0c;积分兑换前去出售买卖转现&#xff0c;店家根据选购积分兑换完成对客户的交易打赏主播&…

【遥感综述】

遥感综述小集合 Image fusion meets deep learning: A survey and perspective&#xff08;张浩&#xff0c;马佳义&#xff09; Sharpening fusion 多光谱图像锐化和高光谱图像锐化是两种典型的锐化融合任务。 Multi-spectral sharpening多光谱锐化 多光谱锐化是将低空间…

Android开发必修—Activity,View,Window三者之间的密切联系【深度解析】

简介 Activity就像工匠&#xff0c;Window就像是窗户&#xff0c;View就像是窗花&#xff0c;LayoutInflater像剪刀&#xff0c;Xml配置像窗花图纸。 Android根据他们不同的职能让他们各斯其活&#xff0c;同时也相互配合展示给我们灵活、精致的界面。 一张图理清所有层级关系&…

量子计算机的推出会影响网络安全吗

在谈量子计算机之前&#xff0c;首先得了解什么是量子计算机。量子计算机是一类遵循量子力学规律进行高速数学和逻辑运算、存储及处理量子信息的物理装置。当某个装置处理和计算的是量子信息&#xff0c;运行的是量子算法时&#xff0c;它就是量子计算机。量子计算机在分析大量…

飞凌OK3568-C嵌入式Linux开发板开箱体验

本篇来介绍一款具有AI计算能力的Linux开发板&#xff1a;OK3568-C。 1 OK3568-C介绍 OK3568-C是飞凌嵌入式设计的一款开发板&#xff0c;板子的包装如下&#xff0c;盒子内有两层&#xff0c;上层是开发板&#xff0c;下层是配件。 1.1 核心板介绍 开发板的SOC采用Rockchip的…

MySQL进阶:索引的使用及理解

MySQL索引前言什么是索引?索引的优缺点?MySql索引添加索引的sql语句添加PRIMARY KEY&#xff08;主键索引&#xff09;添加UNIQUE(唯一索引)添加INDEX(普通索引)添加FULLTEXT(全文索引)添加多列索引索引的底层数据结构哈希索引BTree树索引为什么索引会提高查找速度?最左前缀…

数据结构与算法2—链表

1. 链表 线性表的链式存储结构就是用一组任意的存储单元&#xff08;可以是不连续的&#xff09;存储线性表的数据元素。采用链式存储结构的表示的线性表简称链表。链式存储方式可用于表示线性结构&#xff0c;也可用于表示非线性结构。 链表通常有两个域 data域——存放结点…