redis 简介 -- 数据类型 String List

2 篇文章 0 订阅
1 篇文章 0 订阅

Redis 数据库

Redis 简介

REmote DIctionary Server(Redis) 是一个由Salvatore Sanfilippo写的key-value存储系统。是跨平台的非关系型数据库

Redis 是一个开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络、可基于内存、分布式可选持久性的键值对(Key-Value)存储数据库,并提供多种语言的 API。

Redis 通常被称为数据结构服务器,因为值(value)可以是**字符串(String)、哈希(Hash)、列表(list)、集合(sets)和有序集合(sorted sets)**等类型。

Redis是一个开源(BSD许可),内存存储的数据结构服务器,可用作数据库,高速缓存和消息队列代理。它支持**字符串哈希表列表集合有序集合位图hyperloglogs**等数据类型。内置复制、Lua脚本、LRU收回、事务以及不同级别磁盘持久化功能,同时通过Redis Sentinel提供高可用,通过Redis Cluster提供自动分区

Redis键(key)

redis是通过key-value的形式进行数据的存储的

键命令
命令描述
keys pattern查找所有符合给定模式(pattern)的 key pattern可以是一个正则表达式
exists key检查给定 key 是否存在
type key返回 key 所储存的值的类型
del key该命令用于在 key 存在是删除 key(key 是一个确定的值)
expire key seconds为给定 key 设置过期时间
ttl key以秒为单位,返回给定 key 的剩余生存时间(TTL, time to live)
select dbindex切换数据库【0-15】,默认为0
dbsize查看当前数据库key的数量
flushdb清空当前库
flushall通杀全部库

Redis数据类型

字符串(String)

简介

String 是Redis最基本的类型,你可以理解成与Memcached一模一样的类型,一个key对应一个value。

String 类型是二进制安全的。意思是Redis的String 可以包含任何数据。比如jpg图片或者序列化的对象 。

String 类型是Redis最基本的数据类型,一个键最大能存储512MB。

数据结构

Redis 使用标准 C 语言编写,但在存储字符时,Redis 并未使用 C 语言的字符类型,而是自定义了一个属于特殊结构 SDS(Simple Dynamic String)即简单动态字符串),这是一个可以修改的内部结构,非常类似于 Java 的 ArrayList。

String 采用了预先分配冗余空间的方式来减少内存的频繁分配(初始长度:假设字符串长度为n,初始长度是 n+25)。当字符串所占空间小于 1MB 时,Redis 对字符串存储空间的扩容是以成倍的方式增加的;而当所占空间超过 1MB 时,每次扩容只增加 1MB。Redis 字符串允许的最大值字节数是 512 MB

struct sdshdr {
    // 记录 buf 数组中已使用字节的数量
    // 等于 SDS 所保存字符串的长度
    unsigned  int len;

    // 记录 buf 数组中未使用字节的数量
    unsigned  int free;

    // 字节数组,用于保存字符串
    char buf[];
};
字符串命令
命令描述
set key value设置指定 key 的值
get key获取指定 key 的值
append如果 key 已经存在并且是一个字符串, APPEND 命令将 value 追加到 key 原来的值的末尾
strlen获取值的长度
setex key seconds value将值 value 关联到 key ,并将 key 的过期时间设为 seconds (以秒为单位)
setnx key value只有在 key 不存在时设置 key 的值
incr key将 key 中储存的数字值增一
decr key将 key 中储存的数字值减一
incrby/decrby key step递增或者递减指定的大小
mset key value [key value …]同时设置一个或多个 key-value 对
msetnx key value [key value …]同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在
getrange key stat end返回 key 中字符串值的子字符
setrange key offset value用 value 参数覆写给定 key 所储存的字符串值,从偏移量 offset 开始
getset key newValue将给定 key 的值设为 value ,并返回 key 的旧值(old value
列表(List)

简介

Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素导列表的头部(左边)或者尾部(右边)
一个列表最多可以包含 232 - 1 个元素 (4294967295, 每个列表超过40亿个元素)。

Redis list(列表)相当于 Java 语言中的 LinkedList 结构,是一个链表而非数组,其插入、删除元素的时间复杂度为 O(1),但是查询速度欠佳,时间复杂度为 O(n)。

数据结构

Redis 列表的底层存储结构,其实是一个被称为快速链表(quicklist)的结构。当列表中存储的元素较少时,Redis 会使用一块连续的内存来存储这些元素,这个连续的结构被称为 ziplist(压缩列表),它将所有的元素紧挨着一起存储。

压缩列表是 Redis 为节省内存而开发的,它是由一系列特殊编码的连续内存块组成的顺序型数据结构,一个压缩列表了可以包含任意多个节点,每个节点都可以保存一个字符数组或者整数值。

而当数据量较大时,Redis 列表就会是用 quicklist(快速链表)存储元素。Redis 之所以采用两种方法相结合的方式来存储元素。这是因为单独使用普通链表存储元素时,所需的空间较大,会造成存储空间的浪费。因此采用了链表和压缩列表相结合的方式,也就是 quicklist + ziplist,结构如下图:

在这里插入图片描述

如图,将多个 ziplist 使用双向指针串联起来,这样既能满足快速插入、删除的特性,又节省了一部分存储空间。

列表命令
命令描述
lpush/rpush key value1 value2 …lpush 将一个或多个值插入到列表头部
rpush 在列表中添加一个或多个值
lrange key start end获取列表指定范围内的元素
从零开始,-1表示最后一个,-2 倒数第二个,以此类推
lpop/rpop keylpop 移出并获取列表的第一个元素
rpop 移除并获取列表最后一个元素
rpoplpush k1 k2移除列表k1的最后一个元素,并将该元素添加到列表k2并返回k1的最后一个元素
lindex key index通过索引获取列表中的元素
llen key获取列表长度
linsert key before|after pivot value在列表的元素前或者后插入元素
lrem key count value移除列表元素
lset key index value通过索引设置列表元素的值
lset key index value通过索引设置列表元素的值
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学编程的小猫猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值