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

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 来调用进行实践,一举两得。

我还是决定不换p50pro了P50pro要是有5G,估计也不会破发了,之前有想把mate40pro换p50pro的,一直往店里跑去把玩手机,而且p50pro猛男粉很吸引我,真是让我日思夜想啊,看了各路评测,有其实我还是推荐大家买二手机大学到现在,用下来的手机零零散散也有20部了,买新机的就只有四部,一加7t一加9r三星s10e华为mate40pro,其余都是二手机,第一次接触二手机是微博一个博主淘宝卖二手机,我小米你长点心吧模仿是进击不了高端的小米你长点心吧,模仿也要模仿点样子来吧。外媒Letsgodigital根据小米此前发出的专利内容,做出了小米翻盖折叠屏手机的渲染图。有两个版本,一个是三星后摄方案,一个是华为后摄方现在新出的手机没5G,会影响你购买吗?前阵子华为出了p50系列,全系没有5G版,一个引领全球5G技术发展的公司居然不能推出5G手机,实在是让人感到可惜,可是没办法,生存才是硬道理,只有活着,才有希望去突破。但是消费者有轻薄和大屏无法兼得?这部老手机了解一哈?前阵子,想换掉mate40pro的心隐隐躁动,因为它太重了,加上都是玻璃的机身,加剧了手感的劣化,于是想换p50pro,虽然p50pro是轻薄轻巧了,可是那手感不是很好,金属边边太千万不要买首发买三星这是我大学以来买过的所有三星手机有s9s20s21。几乎都是首发买的,三星手机看起来和用起来都不错。但是还是得跟HXDM说说,三星手机千万不要买首发,都是痛的的体验除非你想最先体验XDM觉得手机屏幕尺寸多少最合适呢?手机现在承担的功能越来越多,所需的屏幕也越来越大,特别是12promax这个怪兽,78mm的宽度加直角边,220多克的重量,上手一会,立马放弃,对我的小拇指压力真的大啊,如果贴膜戴全球三大OLED厂商盘点国产和韩国差距有多大?三星独占鳌头更多汽车资讯欢迎关注公众号亚洲新能源汽车网之前有分析过MicroLED在汽车领域的应用,MicroLED是一门全新的应用技术,发展前景可观,因此也被视为下一代显示技术。那么反观OL蔚来赴港上市计划可能将推迟至2022年日前,据彭博社报道,蔚来汽车或因涉及用户信托持股等方面问题,赴港上市计划可能将推迟至明年。近日有消息称,在2022年初之前,蔚来汽车不太可能登陆港交所,原因是蔚来汽车收到港交所对其五菱变高级了?周迅成为五菱全球代言人更多汽车资讯欢迎关注亚洲新能源汽车网最近,周迅成为五菱全球代言人的消息登上了微博热搜,当我们点进周迅代言五菱这个话题,便能看到点赞量排名较前的几十条大多都在夸赞五菱好像突然高级了五乘联会前8月新能源车零售147。9万辆更多汽车资讯欢迎关注公众号亚洲新能源汽车网9月8日,乘联会发布数据,2021年8月乘用车市场零售达到145。3万辆,同比下降14。7,而且相较2019年8月下降7,增速偏弱。今年1
制作高燃动画怎少的了高能创作本?戴尔灵越16Plus让创作更舒心最近,日本的动漫电影普罗米亚正式登陆全国院线,这部电影在豆瓣拥有8。0分的评分,可以说是今年最燃最有个性的一部动漫电影。普罗米亚讲述了因突变而产生操作火焰的变种人燃烧者四处纵火,让刚刚,苹果公司差点被40年前的专利ampampquot讹ampampquot了3。085亿美元作者黄莺众所周知,各国的专利法对于一项发明的保护期限都有相同的规定,发明专利只给予发明人20年的独占期保护。但是,本周四在美国得克萨斯州联邦法院结束审理的一起专利诉讼案件上,苹果公扫地茅主动维权索赔2000万,奈何专利反被宣告无效2020年7月28日,深圳市中级人民法院受理了科沃斯机器人股份有限公司起诉四家公司涉嫌制造销售和许诺销售的产品侵犯其实用新型专利的案件,案号(2020)粤03民初3599号,并在2夏日说唱季来了!快用戴尔灵越16Plus一起点燃创作热情众所周知,这个夏天不缺说唱节目。近日,说唱听我的2黑怕女孩说唱少年企划三档说唱综艺逐步官宣,一次三档节目即将开播对于热爱说唱的coolboycoolgirl来说简直是惊喜满满!之所AI数字员工来了?华为云发布智能流程机器人方案当前,企业数字化转型正在加速推进,云计算AI大数据等数字技术不仅在赋能企业自身业务开展,也正在掀起一场围绕企业内部业务流程的热潮。而这其中尤以AI数字员工最受瞩目,它借助RPA技术深度赋能618产业链,华为云助力线上购物全流程体验升级618鏖战正酣,一场由电商引起的互联网业态转型和终端科技的较量也越发惹人注目,科技与新零售之间联系日益密切。不少企业为了更灵活高效地协调人货场之间的关系,纷纷发力业务场景的转型升级搭载11代CPURTX3060显卡,戴尔史上最强创作本XPS179710强悍来袭伴随着市面上各种各样的轻薄本层出不穷,不同尺寸大小也吸引着不同的潜在消费者。但依然有很多用户抱着观望的态度,想看看是否会有一款与众不同的轻薄本闪亮登场!就在近日,戴尔又有大动作,发六年纷争,无人机第一案,和解无人机高光时刻已过,专利竞争渐渐褪色作者黄莺2015年2月8日,无人机一哥大疆创新在深圳起诉了成立不满一年的道通智能,指控其尚未推出的XStar无人机侵犯大疆的外观专利。自此,两家年销25亿美元的重磅药中国专利被无效,制药巨头赛诺菲要哭了作者肖研8月4日,国家知识产权局发出两份专利无效的裁决,判决全球制药巨头赛诺菲(专利权人名称是塞诺菲安万特德国有限公司)的两件中国专利全部无效专利一为ZL201510052299。为什么这么多人都在学Python,我该怎样学Python?一首先要想清楚一个问题,我为什么要学Python?为了更高的薪资水平,为了提高办公效率,还是想尝试了解编程?二学Python有什么用?1薪资高互联网行业是众所周知的高薪行业,只要是江西天宇化工成功无效德国巴斯夫的一件除草剂专利近日,国家知识产权局数据显示,江西天宇化工有限公司成功地无效掉化工巨头德国巴斯夫在中国的一件除草剂的专利ZL200880008536。6,发明名称为22氯4甲基磺酰基3(2,2,2