前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Redis原理 -基础数据结构

Redis原理 -基础数据结构

作者头像
王小明_HIT
发布2019-08-13 11:30:02
4370
发布2019-08-13 11:30:02
举报
文章被收录于专栏:程序员奇点程序员奇点

Redis 基础数据结构

String

动态字符串,类似arraylist,当字符串长度消息1M时,扩容是加倍现有空间,超过1M,扩容时会多扩1M空间,字符串长度最大为512M

代码语言:javascript
复制
redis-cli -h 172.31.1.135 -c -p 7000

使用set,get命令进行操作

判断key是否存在

exists key

删除key

del name

设置key的有效时间

set name codehole

expire name 5 # 5s 后过期

setex name 5 codehole # 5s 后过期,等价于 set+expire

wait for 5 seconds

get name

setnx name codehole # 如果 name 不存在就执行 set 创建

有返回值,返回值为1 表示创建成功 为0 创建失败

再次setnx命令,返回 0

setnx name java

使用redis进行计数

set age 30

incr age

还可以使用incrby 进行+/-计算

但是redis自增是有一定的范围的 signed long

set codehole 9223372036854775807

批量set get

mset name1 boy name2 girl name3 unknown

mget name1 name2 name3

如果不在一个slot上会报错的

列表

相当于java里面的linkedlist,链表的插入和删除非常快,复杂度O(1), 索引定位慢,时间复杂度为O(n)

使用场景

Redis 的列表结构常用来做异步队列使用。将需要延后处理的任务结构体序列化成字符串塞进 Redis 的列表,另一个线程从这个列表中轮询数据进行处理

右边进左边出:队列

rpush books python java golang

llen books #列表长度

lpop books #弹出列表第一个

右边进右边出:栈

rpush books python java golang

rpop books

Hash字典

相当于java中的hashmap,无序的,同样采用 数组+链表的二维结构,但是redis,扩容方式不一样, redis采用了渐进性rehash策略,新旧hash结构,循环渐进性的一点点迁移,当迁移完后,旧hash删除,内存回收

Redis和hashmap的扩容不有的地方是采用了渐进式hash,渐进性的一点点迁移

hash 移除了最后一个元素,数据结构会被删除

hash 结构的存储消耗要高于单个字符串

hset mapneme key value

hgetall mapname

hget mapname key

也有批量set

hmset books java "effective java" python "learning python" golang "modern golang programming"

set集合

相当于Java中的hashset,内部键值对是无序的唯一的,内部实现相当于一个特殊的字典,字典中所有value都是一个值NULL

sadd books python

sadd books java golang

smembers books

zset集合

java中sortedSet和HashMap的结合体,一方面是一个set,保证value的唯一性,另外一方面,可以给每个value赋值一个score,代码这个value的排序权重,内部实现是一个类似,跳跃列表的 数据结构

zset 可以用来存粉丝列表,value 值是粉丝的用户 ID,score 是关注时间。我们可以对粉丝列表按关注时间进行排序。

zadd books 9.0 "think in java"

zadd books 8.9 "java concurrency"

zadd books 8.6 "java cookbook"

zrange books 0 -1 # 按 score 排序列出,参数区间为排名范围

zrevrange books 0 -1 # 按 score 逆序列出,参数区间为排名范围

跳跃列表其实采用的是一个二分查找的一个方式

我们需要这个链表按照 score 值进行排序。这意味着当有新元素需要插入时,要定位到特定位置的插入点,这样才可以继续保证链表是有序的。通常我们会通过二分查找来找到插入点,但是二分查找的对象必须是数组,只有数组才可以支持快速位置定位,链表做不到,那该怎么办?想想一个创业公司,刚开始只有几个人,团队成员之间人人平等,都是联合创始人。随着公司的成长,人数渐渐变多,团队沟通成本随之增加。这时候就会引入组长制,对团队进行划分。每个团队会有一个组长。开会的时候分团队进行,多个组长之间还会有自己的会议安排。公司规模进一步扩展,需要再增加一个层级 —— 部门,每个部门会从组长列表中推选出一个代表来作为部长。部长们之间还会有自己的高层会议安排。

过期时间

ttl 可以查看key的过期时间

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-09-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员奇点 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 Redis
腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档