数据结构论坛

注册

 

发新话题 回复该主题

初探Redis [复制链接]

1#
Redis简介

Redis是一个速度非常快的非关系型数据库(non-relationaldatabase)/NoSQL数据库。

Redis不使用表,也不会预定义或者强制去要求用户对Redis存储不同的数据进行关联。

Redis为什么速度非常快?

纯内存操作

数据存在内存中,类似于HashMap。HashMap的优势就是查找和操作的时间复杂度都是O(1)

数据结构简单

不仅数据结构简单,而且对数据操作也简单

单线程

避免了频繁的上下文切换,也不存在多进程或者多线程导致的切换而消耗CPU资源,不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗

Redis数据结构

Redis存储键(key)和5种不同类型的值(value)之间的映射。这5中类型分别为:

STRING(字符串)、LIST(列表)、HASH(散列)、SET(集合)和ZSET(有序集合)。

结构类型结构存储的值STRING字符串、整数或者浮点数LIST一个链表,链表上的每个节点都包含了一个字符串HASH包含键值对的无序散列表SET包含字符串的无序收集器ZSET字符串成员(member)与浮点数(score)分值之间的有序映射,元素的排列顺序由分值大小决定1.STRING(字符串)

字符串示例,键为hello,值为world:

字符串命令:

命令行为时间复杂度GET获取存储在给定键中的值O(1)SET设置存储在给定键中的值O(1)DEL删除存储在给定键中的值(这个命令可以用于所有类型)O(1)INCR自增O(1)DECR自减O(1)

使用

.0.0.1:sethelloworldOK.0.0.1ethello"world".0.0.1elhello(integer)1.0.0.1ethello(nil)

.0.0.1:setnum1OK.0.0.1:incrnum(integer)2.0.0.1etnum"2"2.LIST(列表)

list-key是一个包含3个元素的列表键,列表中的元素是可以重复的:

列表命令:

命令行为时间复杂度LPUSH将给定值推入链表的左端O(N)RPUSH将给定值推入链表的右端O(N)LRANGE获取列表在给定范围上的所有值O(N)LINDEX获取列表在给定位置上的单个元素O(N)LPOP从链表的左端弹出一个值,并返回被弹出的值O(1)

使用

.0.0.1:rpushlist-keyitem(integer)1.0.0.1:rpushlist-keyitem2(integer)2.0.0.1:rpushlist-keyitem(integer)3#返回的列表长度

.0.0.1:lrangelist-key0-11)"item"2)"item2"3)"item"#使用0为范围的开始索引,-1为范围索引的结束索引,可以去除列表包含的所有元素.0.0.1ndexlist-key1"item2"

.0.0.1:lpoplist-key"item".0.0.1:lrangelist-key0-11)"item2"2)"item"3.HASH(散列)

hash-key是一个包含两个键值对的散列键:

散列命令:

命令行为时间复杂度HSET在散列表中关联其给定的键值对O(1)HGET获取指定散列键的值O(1)HGETALL获取散列包含的所有键值对O(N)HDEL如果给定键存在于散列表中,那么移除这个键O(N)

使用

.0.0.1:hsethash-keysub-key1value1(integer)1.0.0.1:hsethash-keysub-key2value2(integer)1.0.0.1:hsethash-keysub-key1value2(integer)0.0.0.1:hgetallhash-key1)"sub-key1"2)"value2"3)"sub-key2"4)"value2"

.0.0.1:hdelhash-keysub-key2(integer)1.0.0.1:hdelhash-keysub-key2(integer)0.0.0.1:hgethash-keysub-key1"value2".0.0.1:hgetallhash-key1)"sub-key1"2)"value2"4.SET(集合)

set-key是一个包含3个元素的集合键:

集合命令:

命令行为时间复杂度SADD将给定元素添加到集合O(N)SMEMBERS返回集合包含的所有元素O(N)SREM如果给定的元素存在于集合中,那么一处这个元素O(N)SISMEMBER检查给定元素是否存在于集合中O(1)

使用

.0.0.1:saddset-keyitem(integer)1.0.0.1:saddset-keyitem2(integer)1.0.0.1:saddset-keyitem3(integer)1.0.0.1:saddset-keyitem(integer)0.0.0.1:smembersset-key1)"item"2)"item3"3)"item2"

.0.0.1:sismemberset-keyitem4(integer)0.0.0.1:sismemberset-keyitem(integer)1

.0.0.1:sremset-keyitem(integer)1.0.0.1:sremset-keyitem(integer)0.0.0.1:smembersset-key1)"item3"2)"item2"5.ZSET(有序集合)

zset-key是已一个包含2个元素的有序集合键:

有序集合命令:

命令行为时间复杂度ZADD将一个带有给定分值的成员添加到有序集合里面O(Mlog(N))ZRANGE根据元素在有序排列中所处的位置,从有序集合中获取多个元素O(log(N)+M)ZRANGEBYSCORE获取有序集合在给定范围内的所有元素O(log(N)+M)ZREM如果给定成员存在于有序集合,那么移除这个成员O(Mlog(N))

使用

.0.0.1:zaddzset-keymember1(integer)1.0.0.1:zaddzset-keymember2(integer)1.0.0.1:zaddzset-keymember2(integer)0.0.0.1:zrangezset-key0-1withscores1)"member1"2)""3)"member2"4)""

.0.0.1:zrangebyscorezset-keywithscores1)"member1"2)""

.0.0.1:zremzset-keymember1(integer)1.0.0.1:zremzset-keymember1(integer)0.0.0.1:zrangezset-key0-1withscores1)"member2"2)""扩展

Redis命令大全

Redis与Memcached

两者都是非关系型内存键值数据库,主要有以下不同:

数据类型

Redis支持五种不同的数据类型,可以更灵活地解决问题

Memcached仅支持字符串类型

数据持久化

Redis支持两种持久化策略:RDB快照和AOF日志

Memcached不支持持久化。

分布式

RedisCluster实现了分布式的支持

Memcached不支持分布式,只能通过在客户端使用一致性哈希来实现分布式存储,这种方式在存储和查询时都需要先在客户端计算一次数据所在的节点。

内存管理机制

在Redis中,并不是所有数据都一直存储在内存中,可以将一些很久没用的value交换到磁盘,而Memcached的数据则会一直在内存中。

Memcached将内存分割成特定长度的块来存储数据,以完全解决内存碎片的问题。但是这种方式会使得内存的利用率不高,例如块的大小为bytes,只存储bytes的数据,那么剩下的28bytes就浪费掉了。

线程模型

Redis使用单线程的多路IO复用模型

Memcached是多线程,非阻塞IO复用的网络模型

预览时标签不可点收录于话题#个上一篇下一篇
分享 转发
TOP
发新话题 回复该主题