范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

Redis实战01。Redis数据结构简介

  一些数据库和缓存服务器的特性和功能 P4
  名称类型数据存储选项查询类型附加功能 Redis使用内存存储(in-memory)的非关系数据库字符串、列表、哈希表、集合、有序集合每种数据类型都有自己的专属命令,另外还有批量操作(bulk operation)和不完全(partial)的事务支持发布与订阅,主从复制(master/slave replication)memcached使用内存存储的键值缓存键值之间的映射增删改查以及其他几个命令为提升性能而设的多线程服务器MySQL关系数据库每个数据库可以包含多个表,每个表可以包含多个行;可以处理多个表的试图(view);支持空间(spatial)和第三方扩展增删改查、函数、存储过程支持ACID性质(需要使用InnoDB),主从复制和主主复制(master/master replication)PostgreSQL关系数据库每个数据库可以包含多个表,每个表可以包含多个行;可以处理多个表的试图;支持空间和第三方扩展;支持可定制类型增删改查、内置函数、自定义的存储过程支持ACID性质,主从复制,由第三方支持的多主复制(multi-master replication)MongoDB使用硬盘存储(on-disk)的非关系文档存储每个数据库可以包含多个表,每个表可以包含多个无schema (schema-less) 的 BSON 文档(Binary JSON,类似json的一种二进制格式)增删改查支持 map-reduce 操作,主从复制,分片,空间索引(spatial index)
  持久化方式 P4 RDB(redis database):以快照的形式将数据持久化到磁盘AOF(append only file):以日志的形式记录每个操作,将Redis执行过的所有指令全部记录下来(读操作不记录),只许追加文件但不可以修改文件,Redis启动时会读取AOF配置文件重构数据Redis 的 5 种结构 P6
  结构类型结构存储的值结构的读写能力 STRING可以是字符串、整数或者浮点数对整个字符串或者字符串的其中一部分执行操作;对整数和浮点数执行自增(increment)或者自减(decrement)LIST一个链表,链表上的每个节点都包含了一个字符串从链表的两端推入或者弹出元素;根据偏移量对链表进行修剪(trim);读取单个或者多个元素;根据值查找或者移除元素HASH包含键值对的无序哈希表添加、获取、移除单个键值对;获取所有键值对SET包含字符串的无序收集器(unordered collection),并且被包含的每个字符串都是独一无二、各不相同的添加、获取、移除单个元素;检查一个元素是否存在于集合中;计算交集、并集、差集;从集合里面随机获取元素ZSET(有序集合)字符串成员(member)与浮点数分值(score)之间的有序映射,元素的排列顺序由分值的大小决定添加、获取、移除单个元素;根据分值范围(range)或者成员来获取元素STRING 基础命令 P8
  STRING 存储键值对,值既可以是字符串,又可以是数值(数值支持自增和自减)package main  import (     "fmt"     "github.com/gomodule/redigo/redis"     "time" )  func main() {     // 获取连接     conn, err := redis.Dial("tcp", "127.0.0.1:6379")     if err != nil {         // 连接失败,则打印错误信息,并退出         fmt.Println(err)         return     }      // 如果连接成功,则延迟执行 关闭     defer conn.Close()      executeStringCommand(conn) }  // 执行 STRING 的相关命令 func executeStringCommand(conn redis.Conn) {     fmt.Println("--------- executeStringCommand start ---------")      // 设置 键为 hello 的值为 world,永久有效     result, err := conn.Do("SET", "hello", "world")     handleResult(result, err)      // 获取 键为 hello 的剩余时间(TTL -> 秒,PTTL -> 毫秒)     result, err = redis.Int(conn.Do("TTL", "hello"))     handleResult(result, err)      // 获取 键为 hello 的值     result, err = redis.String(conn.Do("GET", "hello"))     handleResult(result, err)      // 设置 键为 hello 的值为 world,有效时间为 1000ms(EX -> 秒,PX -> 毫秒;不可同时使用)     result, err = conn.Do("SET", "hello", "world", "EX", "1")     handleResult(result, err)      // 获取 键为 hello 的剩余时间(TTL -> 秒,PTTL -> 毫秒)     result, err = redis.Int(conn.Do("PTTL", "hello"))     handleResult(result, err)      time.Sleep(time.Second * 2)     // 获取 键为 hello 的剩余时间(TTL -> 秒,PTTL -> 毫秒)     result, err = redis.Int(conn.Do("PTTL", "hello"))     handleResult(result, err)      // 设置 键为 hello 的值为 world,永久有效(NX -> 键不存在时,才进行设置操作;XX -> 键已经存在时,才进行设置操作)     result, err = conn.Do("SET", "hello", "world!", "XX")     handleResult(result, err)      // 设置 键为 hello 的值为 world,永久有效(NX -> 键不存在时,才进行设置操作;XX -> 键已经存在时,才进行设置操作)     result, err = conn.Do("SET", "hello", "world!", "NX")     handleResult(result, err)      // 删除 键为 hello 的值(可以用于所有类型)     result, err = conn.Do("DEL", "hello")     handleResult(result, err)      // 获取 键为 hello 的值     result, err = redis.String(conn.Do("GET", "hello"))     handleResult(result, err)      fmt.Println("--------- executeStringCommand end ---------") }  // 处理操作 redis 的结果 func handleResult(result interface{}, err error) {     if err != nil {         fmt.Println("ERROR: ", err)         return     }     fmt.Println(result) } LIST 基础命令 P9 // 执行 LIST 的相关命令 func executeListCommand(conn redis.Conn) {     fmt.Println("--------- executeListCommand start ---------")      // 在 list 列表的 右端 插入值     result, err := conn.Do("RPUSH", "list", "item-1", "item-2")     handleResult(result, err)      // 在 list 列表的 左端 插入值     result, err = conn.Do("LPUSH", "list", "item-3", "item-4")     handleResult(result, err)      // 在 list 列表中 以左端为头获取 [1, 3] 范围内的所有值(结束索引为 -1 表示可以取出到列表尾的所有元素;没有 RRANGE 命令)     result, err = redis.Strings(conn.Do("LRANGE", "list", "1", "-1"))     handleResult(result, err)      // 在 list 列表中 以左端为头获取 下标为 0(没有 RINDEX 命令)     result, err = redis.String(conn.Do("LINDEX", "list", "0"))     handleResult(result, err)      // 在 list 列表的 右端 弹出并一个值     result, err = redis.String(conn.Do("RPOP", "list"))     handleResult(result, err)      // 在 list 列表的 左端 弹出并一个值     result, err = redis.String(conn.Do("LPOP", "list"))     handleResult(result, err)      // 删除 键为 list 的值(可以用于所有类型)     result, err = conn.Do("DEL", "list")     handleResult(result, err)      // 在 list 列表中 以左端为头获取所有值     result, err = redis.Strings(conn.Do("LRANGE", "list", "0", "-1"))     handleResult(result, err)      fmt.Println("--------- executeListCommand end ---------") } SET 基础命令 P10 // 执行 SET 的相关命令 func executeSetCommand(conn redis.Conn) {     fmt.Println("--------- executeSetCommand start ---------")      // 在 set 集合中 添加值     result, err := conn.Do("SADD", "set", "item-1", "item-2", "item-2", "item-3", "item-4")     handleResult(result, err)      // 从 set 集合中 删除值     result, err = conn.Do("SREM", "set", "item-2", "item-3")     handleResult(result, err)      // 判断一个值是否在 set 集合中     result, err = redis.Bool(conn.Do("SISMEMBER", "set", "item-2"))     handleResult(result, err)      // 获取 set 集合中 的所有值(不推荐使用,大 key 执行慢)     result, err = redis.Strings(conn.Do("SMEMBERS", "set"))     handleResult(result, err)      // 删除 键为 set 的值(可以用于所有类型)     result, err = conn.Do("DEL", "set")     handleResult(result, err)      fmt.Println("--------- executeSetCommand end ---------") } HASH 基础命令 P11
  HASH 可以存储多个键值对之间的映射,和 STRING 一样,存储的值既可以是字符串,又可以是数值(数值支持自增和自减)// 执行 HASH 的相关命令 func executeHashCommand(conn redis.Conn) {     fmt.Println("--------- executeHashCommand start ---------")      // 在 hash 哈希表中 添加一个键值对     result, err := conn.Do("HSET", "hash", "key-1", "item-1")     handleResult(result, err)      // 在 hash 哈希表中 添加多个键值对     result, err = conn.Do("HMSET", "hash", "key-2", "item-2", "key-3", "item-3", "key-4", "item-4", "key-5", "item-5")     handleResult(result, err)      // 从 hash 哈希表中 获取键 为 key-1 的值     result, err = redis.String(conn.Do("HGET", "hash", "key-1"))     handleResult(result, err)      // 从 hash 哈希表中 获取多个键值对(返回值的顺序和传入参数的顺序一样)     result, err = redis.Strings(conn.Do("HMGET", "hash", "key-2", "key-1"))     handleResult(result, err)      // 删除 hash 哈希表中键为 key-1 的值(可以用于所有类型)     result, err = conn.Do("HDEL", "hash", "key-1")     handleResult(result, err)      // 从 hash 哈希表中 获取所有键值对(不推荐使用,大 key 执行慢)     result, err = redis.StringMap(conn.Do("HGETALL", "hash"))     handleResult(result, err)      // 删除 键为 hash 的值(可以用于所有类型)     result, err = conn.Do("DEL", "hash")     handleResult(result, err)      fmt.Println("--------- executeHashCommand end ---------") } ZSET 基础命令 P12
  ZSET 和 HASH 一样,都用于存储键值对。ZSET 的键被称为成员(member),每个成员都是各不相同的;值被称为分值(score),分值必须为浮点数。ZSET 是 Redis 里面唯一一个既可以根据成员访问元素,又可以根据分值以及分值的排列顺序来访问元素的结构。// 执行 ZSET 的相关命令 func executeZsetCommand(conn redis.Conn) {     fmt.Println("--------- executeZsetCommand start ---------")      // 在 zset 有序集合中 添加值     result, err := conn.Do("ZADD", "zset", "0", "item-1", "12.34", "item-1", "-12.34", "item-2", "56.78", "item-3", "-56.78", "item-4", "-56.78", "item-5")     handleResult(result, err)      // 从 zset 有序集合中 删除值     result, err = conn.Do("ZREM", "zset", "item-2", "item-3")     handleResult(result, err)      // 获取 zset 有序集合中 指定范围的值(结束索引为 -1 表示从开始索引到结束的所有值)     // 成员的位置按 score 值递增(从小到大)来排序,相同 score 值的成员按字典序升序来排列     // WITHSCORES 选项可以让成员和它的 score 值一并返回,返回列表格式:value1,score1, ..., valueN,scoreN     result, err = redis.Strings(conn.Do("ZRANGE", "zset", "0", "-1", "WITHSCORES"))     handleResult(result, err)      // 获取 zset 有序集合中 指定范围的值(结束索引为 -1 表示从开始索引到结束的所有值)     // 成员的位置按 score 值递减(从小到大)来排序,相同 score 值的成员按字典序降序来排列     // WITHSCORES 选项可以让成员和它的 score 值一并返回,返回列表格式:value1,score1, ..., valueN,scoreN     result, err = redis.Strings(conn.Do("ZREVRANGE", "zset", "0", "-1", "WITHSCORES"))     handleResult(result, err)      // 获取 zset 有序集合中 score 在指定范围 min, max 的值(-inf:负无穷,+inf 正无穷;默认为闭区间,数字前加 ( 表示开区间)     // 成员的位置按 score 值递增(从小到大)来排序,相同 score 值的成员按字典序升序来排列     // WITHSCORES 选项可以让成员和它的 score 值一并返回,返回列表格式:value1,score1, ..., valueN,scoreN     // LIMIT offset, count 和 SQL 中 limit 一样,指定返回结果的数量及区间     result, err = redis.Strings(conn.Do("ZRANGEBYSCORE", "zset", "-inf", "+inf", "WITHSCORES"))     handleResult(result, err)      // 获取 zset 有序集合中 score 在指定范围 max, min 的值(-inf:负无穷,+inf 正无穷;默认为闭区间,数字前加 ( 表示开区间)     // 成员的位置按 score 值递减(从小到大)来排序,相同 score 值的成员按字典序降序来排列     // WITHSCORES 选项可以让成员和它的 score 值一并返回,返回列表格式:value1,score1, ..., valueN,scoreN     // LIMIT offset, count 和 SQL 中 limit 一样,指定返回结果的数量及区间     result, err = redis.Strings(conn.Do("ZREVRANGEBYSCORE", "zset", "(12.34", "-inf", "WITHSCORES", "LIMIT", "1", "1"))     handleResult(result, err)      // 删除 键为 zset 的值(可以用于所有类型)     result, err = conn.Do("DEL", "zset")     handleResult(result, err)      fmt.Println("--------- executeZsetCommand end ---------") } 所思所想慢即是快,不要眼高手低。刚开始看了几页就感觉太基础了,平常都有使用,不想再继续读下去。转念一想,以前只知道部分指令的作用,没有实践,这次可以好好操作一下。为了提高自己的兴趣,决定用 Golang 来调用进行实践,一举两得。

怪不得阻拦华为发展!原来是华为太安全,非洲国家率先做出决定众所周知,中美两国近年来的关系一直处于紧张状态,美国从多个方面对中国进行抹黑造谣,并且还试图阻碍中国经济和科技的发展。比如华为企业,对于国家的科技发展来说,有着非常重要的作用,但是3000万!董明珠力挺鸿蒙后,华为正式宣布,新增8款升级机型祖国的百年华诞,让吾辈深感自豪与幸福,自豪于生在中华,四海内皆祥和,幸福在神州大地上,一片欣欣向荣。关注科技领域的各位,应该感触尤深,都说科技产业是一个国家的脊梁,我们庆幸近些年里别再用网盘了,爱国者移动固态硬盘1GB传输仅2秒,这才是真香对于很多学生和上班族而言,数据存储一直都是头等大事,我们每天都会产生非常多的数据内容,各种的文档办公资料,如果是自媒体行业,大大小小的视频图片更是占用空间,庞大的素材不计其数。面对vivoS10发布时间官宣,7月15日为你带来自然美提及市场中主打影像特别是自拍功能以及机身颜值的产品,vivo旗下的S系列无疑成为了许多朋友印象中首先出现的产品。而作为面向中高端市场的机型,S系列也凭借着例如S7S9等机型在产品端薄如iPhone7小似火柴盒,大容量高速传输不掉速,爱国者S7Pro体验写在前面对上班族学生党摄影师剪辑师网红达人Vlog博主和自媒体等人群来说,平时存储数据的时候都会用到移动硬盘,可大多数移动硬盘体积与重量都不小,携带显得诸多不便。为自己正确配备一块5G手机测试质量信誉度积分榜单公布,vivo获三榜单最高星级想要知道某个手机厂商的手机产品质量好不好,很多朋友都会看各大权威实验室公布的产品评估数据。就在近日,中国移动终端实验室公布了2021年6月的5G手机测试质量信誉度积分,并细分为深度OPPO游戏手机专利公布ACE复活?OPPO在之前曾经推出过名为ACE的产品线,主打的是高性价比和游戏,虽然只发布过两款产品,但每一款产品都会联名一个热门IP全套定制,吸引了很多粉丝。不过后来因为产品线重叠的原因,就6月游戏排行榜策略类游戏异军突起养老手游实力突出近日,七麦数据发布了6月热门游戏排行榜,包含游戏下载榜和游戏收入榜。在热门游戏下载榜Top3中,有两款新上线游戏6月1日正式上线的休闲养老游戏摩尔庄园以700w的预估下载量占据榜首Win11首个预览版UI变化很大,但功能不全,不推荐更新6月29日,微软正式向Windows预览体验计划Dev渠道推送首个Windows11预览版InsiderPreview,版本号为10。0。22000。51(corelease)。那求专业的人推荐一套1000元左右的最具性价比的电脑主机配置?来了目前是2021年7月份,1000预算最佳性价比主机安排。这个预算下当然是洋垃圾加二手配件。处理器e52667,六核十二线,默频2。9g睿频3。5g,性能均衡,性价比吊打其他乱七中国早已今非昔比!英国下令禁用华为,中企直接收购英最大芯片商西方国家近几年在国际上的动作非常奇怪,还在不断抑制中国发展搞一些没有用的小动作。尤其是在全球疫情爆发阶段,这些国家不仅不用心处理国内疫情,反而以此对中国指手画脚,比如督促世卫组织对
元宇宙的未来是怎样的?一众科创精英多维度解读21世纪经济报道记者张赛男上海报道元宇宙的火热引发了学界和业界的共同关注。1月16日,复旦大学管理学院2022瞰见对话科创人物开年首讲举办。本次论坛以庄周与梦蝶走进元宇宙的平行世界华为智慧屏V系列,越看越舒服,让孩子心甘情愿上网课一直以来,电视的发展都代表着整个时代科技的革新。从全村人挤在仅14寸的黑白电视前观看节目,到如今每家每户都用上了大尺寸的超薄液晶电视,你很难不去期待电视未来会变成什么样。机锋君今天三大运营商高速增长,提速降费前功尽弃?最近三大运营商都公布了一季度的经营报告。工信部的数据显示,在老大哥中国移动的直接带领下,三大运营商都实现了高速增长,行业平均增速为11。6,其中中国移动和中国电信的增速都超过了14华为这50倍放大拍照效果,你相信是手机能拍出来的吗?一组国外媒体的照片,华为P30说pro拍摄的看下放大后,远处的游船,清晰可见,这50倍效果有没有震惊到你?有人说我对拍照没有什么要求,这50倍焦段对我来说没什么用小编要说的是,用不比集五福更给力!今天,马云撒9亿红包雨,微信又被超越了长达19天的持久作战,今天,大家期待的支付宝9亿元大项目终于完成了。上个月初,为了刺激支付宝线下扫码消费,马云再次撒钱,推出到店付款19天,瓜分9亿,组队赢翻倍活动,只要在31天内谁将点燃第三次世界大战的战火?美国专家给出的答案截然不同本文章已经通过区块链技术进行版权认证,禁止任何形式的改编转载抄袭,违者追究法律责任第二次世界大战已经过去了很久,现在世界上也没有再发生如此大规模的战争了。但是我相信,有一件事大家一我国成功发射天链二号01星2019年3月31日23时51分,我国在西昌卫星发射中心用长征三号乙运载火箭,将天链二号01星送入太空,卫星成功进入地球同步轨道。天链二号01星是我国第二代数据中继卫星系统的第一颗扫雷都玩过,但是你知道扫雷的世界纪录有多快吗?每个人一定都接触过一种叫做扫雷的游戏,这是由微软设计师罗伯特德姆和卡特约翰逊于1981年设计的。许多人可能在几次尝试后就放弃了。毕竟,如果他们不理解游戏规则,即使这是最简单的难度,日薪1万元!要求会骑电瓶车!这则招聘让网友超激动我要暴富啦3月28日,菜鸟裹裹在微博发布了一则招聘信息日薪1万元,招募全民寄件服务体验官。具体要求都有啥?日薪1万元,只招3人,体验菜鸟裹裹快递员的工作。为寄件用户提供1小时上门取件的服务,刚刚,又一国产手机实力圈粉!来源财经要参一hr只做最屌的产品,只圈最硬的粉丝,只拼一个市场的生意!说起国产手机,你想到的都是哪些品牌?是搅翻欧洲市场的华为中兴,还是雄心勃勃进军海外市场的小米VIVO?跟这些手全球首个启用5G的国家,比中国还要快,难怪称华为是功臣先声夺人,科引潮流,先你所想。我是原创作者小枫说科技,专门为大家写一些自己的原创作品。随着现在互联网科技的发展,相信大家也是深有体会,在这种高速发展的社会,我们从中也能享受到科技带