redis简介以及五种基础类型

redis简介

redis全称为Remote Dictionary Server 远程字典服务器

我们可以将它理解为一种可以用键值对的形式来存储数据的数据库。

而redis有许多的特性,比如说它开源,使用C语言编写,支持网络交互而且它在基于内存来操作数据的同时还是可以进行持久化的数据库。

而且除了我们上面说的以键值对来存储数据,它还有其他的四种基础数据类型 list(列表),hash(字典),set(集合),zset(有序集合)。还有其他四种扩展类型,这个我们在后边的文章中再聊。今天我们主要让初识者了解一下redis。

redis五种基本数据类型

在介绍它们之前,我先将其与Java相关内容作以类比,帮助大家快速认识。

  • String 类似 Map<String,String>
  • List     类似 Map<String,List>
  • Map   类似 Map<String,Map>
  • Set     类似 Map<String,HashSet<String>>
  • ZSet  类似 Map<String,String<Double,String>>

1、String(字符串)

string类型是Redis最基本的数据类型,一个键最大能存储512MB。string类型是二进制安全的。意思是 redi s的string可以包含任何数据。

原理:
redis的字符串是动态字符串,内部结构类似ArrayList。采用预分配冗余空间的方式减少内存的频繁分配。 内部为字符串分配的实际空间一般高于字符串长度,当字符串长度<1MB时,扩容方式是直接加倍,如果 >1MB,一次扩容只扩1MB,直到扩大到512MB。
 

相关命令:

1)strlen 查看字符串的长度

2)append 增加后缀,返回字符串的长度

3) incr 自增 , decr 自减。 增加 incrby key value。 decrby 减少,同上。(当value为整数时可用)

4) getrange key start end 获取从初始位置到结束位置的值。setrange key start newStr 设置从起始位置开始,替换指定位置为新的字符串。 

5) 整合命令 setex = set + expire 使用方式: setex + key + 时间 + value setnx = set + exists = set if not exists 使用方式: setnx + key + value 如果key不存在,则设置数据,返回1。如果存在,不设置,返回0。 getset 先取出原来的值,再设置为新值 使用方式: getset + key + value 返回旧值。

6) 批量操作 mget = more get 使用方式 : mget + key1 + key2 + key3 参数接收多个key, 结果返回多个value mset = more set 使用方式:mset + key1 + value1 + key2 + value2 一次设置多个key和value, 参数本身是个map msetnx 使用方式同上。

2、List(列表)

redis的列表是一个字符链表,内部结构类似LinkedList。left,right都可以插入添加。如果键不存在,创建新 的链表。如果键已经存在,新增内容。如果值全移除,对应的键也就消失了。 列表最多可存储 2^32 - 1 元素 (4294967295, 每个列表可存储40多亿)。
原理: 底层是一个“快速链表”(quicklist)的结构,在列表元素较少时,使用连续的内存存储成压缩列表ziplist。当数 据量较多时,改成quicklist,也就是将多个ziplist使用双向指针串起来使用,以减少内存的碎片化。

相关命令:

1)存取操作

     push pop range lpush : 从左侧存入数据 相当于栈结构

     弹出时执行 lpop (从左侧弹出)

     rpush: 从右侧存入数据 相当于队列结构 弹出时执行lpop (从左侧弹出)

     lrange: 范围内查看数据 使用方式:lrange key start end

2)对list操作

    llen 查看长度 lindex 获取某一个位置的值,下角标从0开始 lrem 删除n个value的值 使用方式: lrem key N value ltrim

    截取某个范围的数据重新赋值给key 使用方式: ltrim key start end (下角标从0开始)

    linsert 插入数据到某个位置的前后 使用方式: linsert key before/after oldValue newValue 如果要插入数据到头部,还可以使用 lpushx, 使用方式:lpushx key value 同理,如果要插入数据到尾部,可以使用 rpushx, 使用方式同上。

    lset 可以更改指定位置的值 使用方式: lset key index value

3、Hash(字典)

redi s的无序字典是一个string类型的field和value的映射表,内部结构类似HashMap。 每个 hash 可以存储 2^32 - 1 个键值对(40多亿)。
原理:
底层的实现结构,与HashMap也一样,是“数组+链表”的二维结构,第一维hash的数据位置碰撞时,将碰撞元素用链 表串接起来,不同的是,redi s字典的值只能是字符串,而且两者的rehash方式不同。java的hashmap是一次全部 rehash,耗时较高,redi s为了优化性能,采用渐进式rehash策略。具体方式为,同时保留新旧两个hash结构,然后 逐步搬迁,搬迁完成后再取而代之。

相关命令:

CRUD :hset / hget / hmset / hmget / hdel / hsetnx  
遍历操作: hgetall / hlen / hex i sts / hkeys / hvals
数值操作:hincrby / hincrbyfloat

4、Set(集合)

redis的集合是string类型的无序不重复的元素集。同时提供求交集、并集、差集等操作 集合中最大的成员数为 2^32 - 1(40多亿)。
原理: 类似HashSet,也是通过哈希表实现的,相当于所有的value都是空。通过计算hash的方式来 快速排重,也是set能提供判断一个成员是否在集合内的原因。

相关命令:

1)读写操作: sadd 创建set类型的value

                         smembers key 查询set中的所有值

                         sismember key value 判断value是否在key所对应的set中, 如果在返回1,如果不在返回0

2)更新操作: srem key value1 value2 删除set中一至多个数据的值 srandmember key num 可以在set中随机出num个元素 spop key num 可以随机弹出num个元素返回

3) 交互操作: smove key1 key2 value 移动元素value从key1到key2

顺带说一下取交、并、差集 命令分别为 sinter / sunion/sdiff

5、ZSet(有序集合)

redis的有序集合和set一样也是string类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个 double类型的分数。redis正是通过分数来为集合中的成员进行从小到大排序。zset的成员是唯一的,但分数 (score)却可以重复。
原理: 类似于SortedSet和HashMap的结合,内部实现是一种叫“跳跃列表”的数据结构。通过层级制,将元素分层 并串联,每隔几个元素选出一个代表,再将代表使用另外一级指针串起来,以此类推,形成金字塔结构。同一个 元素在不同层级之间身兼数职,是“跳跃”。新元素插入时,逐层下潜,直到找到合适的位置。

相关命令:

CRUD :zadd / zrem / zrange + withscores
范围操作:zrangebyscore + 用”(”代表不包含 + limit
  统计操作:zcard / zcount / zrank
  逆序操作:zrevrank / zrevrange / zrevrangebyscore
 
 
 
OK,以上就是redis的一些基本的知识了,夜已深了早点休息,保护头发咯。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值