Redis源码研究—基础知识
1. Redis 是什么
Redis是一个开源的使用ANSI C语言编写的基于内存的key/value存储系统,与memcache类似,但它支持的value类型更多,包括:字符串(string)、链表(list)、集合(set)、有序集合(sorted set)和hash tablehttp://blog.nosqlfan.com/html/2235.html等,这些数据类型支持push/pop、add/remove、交集并集差集及其他更丰富的操作,且这些操作均是原子性的。
按照分布式领域的CAP理论,Consisency、Availability、Tolerance to network Partitions这三个部分在任何系统架构实现时,只能同时满足其中两点,没法三者兼顾。Redis是一个数据库,它将重点放在了Consisency和Availability上,因而Redis只是一个单机的key/value系统,并不直接支持分布式,同时考虑到Tolerance to network Partitions,它支持将数据同步到多台从库上。
2. Redis 有哪些优点
与memcache和MySQL等类似产品比较,Redis有以下几个优点:
(1) 非常丰富的数据结构,且这些数据结构的常见操作均是原子性的;
(2) 高速读写。Memcached提供了CAS命令,可以保证多个并发访问操作同一份数据的一致性问题。 Redis没有提供CAS命令,不过Redis提供了事务的功能,可以保证一串 命令的原子性,中间不会被任何操作打断。MYSQL使用了锁,而memcache未使用锁,进而效率极高。总之,Redis用自己实现的事件分离器,代码量很短,没有CAS,没有lock,因而效率非常高。
关于memcache与redis的比较,可参考这篇文章:《Redis与Memcached的比较》http://tech.it168.com/a2011/0818/1234/000001234403_1.shtml
3. Redis 有哪些缺点
Redis主要缺点有两个:
(1) 持久化。 Redis直接将数据存储到内存中,可通过两种方式持久化:定时快照(snapshot)和基于语句的追加(AppendOnlyFile,aof)。Snapshot的方法是指每隔一段时间将整个数据库的数据写到磁盘上,很明显,每次均是写全部数据,代价非常高;而aof方法只追踪变化的数据,这类似于mysql的binlog方法,但追加log可能过大,同时所有操作均要重新执行一遍,恢复速度慢。
(2) 耗内存。尽管Redis对一些数据结构采用了压缩算法存储,但占用内存量还是过高。
4. Redis 的应用场景
Redis的作者antirez曾笑称其为一个数据结构服务器(data structures server),的确,利用Redis灵活多变的数据结构和数据操作,我们可以很容易的实现各种功能,下面列举几个典型的操作:
(1) 计数器
Redis的命令均是原子性的,可以很容易使用INCR、DECR命令来构建计数器系统
(2) 获取最新的N个数据操作
可使用list何种的LPUSH和LTRIM操作。
(3) 排行榜应用,取TOP N操作
上面一个操作是按时间就行排序,而这个则是用于自定义的一个条件,比如点击次数等,这时候可使用sorted set这种数据结构。
更多应用场景,可参考一下几篇文章:
【1】《redis 点滴》:http://www.jeffkit.info/2011/05/994/
【2】 Redis中7种集合类型应用场景:http://blog.prosight.me/index.php/2011/08/802
【3】 Redis作者谈Redis应用场景:http://blog.nosqlfan.com/html/2235.html
5. Redis 使用体验
(1)选定某个数据库select
对于SQL类的数据库,我们可以创建n个数据库,且每个数据库都对应一个名字,我们通常会先选择一个数据库,再对数据库中的表操作,而Redis则不同,在Redis中,数据库被赋以一个整数编号(从0开始),默认情况下是对数据库0进行操作,数据库的数目可以在配置文件redis.conf中databases属性指定。
(2)数据库存储和检索
直接使用http://redis.io/commands上的命令完成数据存储和检索即可
1. Redis 是什么
Redis是一个开源的使用ANSI C语言编写的基于内存的key/value存储系统,与memcache类似,但它支持的value类型更多,包括:字符串(string)、链表(list)、集合(set)、有序集合(sorted set)和hash tablehttp://blog.nosqlfan.com/html/2235.html等,这些数据类型支持push/pop、add/remove、交集并集差集及其他更丰富的操作,且这些操作均是原子性的。
按照分布式领域的CAP理论,Consisency、Availability、Tolerance to network Partitions这三个部分在任何系统架构实现时,只能同时满足其中两点,没法三者兼顾。Redis是一个数据库,它将重点放在了Consisency和Availability上,因而Redis只是一个单机的key/value系统,并不直接支持分布式,同时考虑到Tolerance to network Partitions,它支持将数据同步到多台从库上。
2. Redis 有哪些优点
与memcache和MySQL等类似产品比较,Redis有以下几个优点:
(1) 非常丰富的数据结构,且这些数据结构的常见操作均是原子性的;
(2) 高速读写。Memcached提供了CAS命令,可以保证多个并发访问操作同一份数据的一致性问题。 Redis没有提供CAS命令,不过Redis提供了事务的功能,可以保证一串 命令的原子性,中间不会被任何操作打断。MYSQL使用了锁,而memcache未使用锁,进而效率极高。总之,Redis用自己实现的事件分离器,代码量很短,没有CAS,没有lock,因而效率非常高。
关于memcache与redis的比较,可参考这篇文章:《Redis与Memcached的比较》http://tech.it168.com/a2011/0818/1234/000001234403_1.shtml
3. Redis 有哪些缺点
Redis主要缺点有两个:
(1) 持久化。 Redis直接将数据存储到内存中,可通过两种方式持久化:定时快照(snapshot)和基于语句的追加(AppendOnlyFile,aof)。Snapshot的方法是指每隔一段时间将整个数据库的数据写到磁盘上,很明显,每次均是写全部数据,代价非常高;而aof方法只追踪变化的数据,这类似于mysql的binlog方法,但追加log可能过大,同时所有操作均要重新执行一遍,恢复速度慢。
(2) 耗内存。尽管Redis对一些数据结构采用了压缩算法存储,但占用内存量还是过高。
4. Redis 的应用场景
Redis的作者antirez曾笑称其为一个数据结构服务器(data structures server),的确,利用Redis灵活多变的数据结构和数据操作,我们可以很容易的实现各种功能,下面列举几个典型的操作:
(1) 计数器
Redis的命令均是原子性的,可以很容易使用INCR、DECR命令来构建计数器系统
(2) 获取最新的N个数据操作
可使用list何种的LPUSH和LTRIM操作。
(3) 排行榜应用,取TOP N操作
上面一个操作是按时间就行排序,而这个则是用于自定义的一个条件,比如点击次数等,这时候可使用sorted set这种数据结构。
更多应用场景,可参考一下几篇文章:
【1】《redis 点滴》:http://www.jeffkit.info/2011/05/994/
【2】 Redis中7种集合类型应用场景:http://blog.prosight.me/index.php/2011/08/802
【3】 Redis作者谈Redis应用场景:http://blog.nosqlfan.com/html/2235.html
5. Redis 使用体验
(1)选定某个数据库select
对于SQL类的数据库,我们可以创建n个数据库,且每个数据库都对应一个名字,我们通常会先选择一个数据库,再对数据库中的表操作,而Redis则不同,在Redis中,数据库被赋以一个整数编号(从0开始),默认情况下是对数据库0进行操作,数据库的数目可以在配置文件redis.conf中databases属性指定。
(2)数据库存储和检索
直接使用http://redis.io/commands上的命令完成数据存储和检索即可
(3)支持事务
MULTI, EXEC, DISCARD 和 WATCH 命令是Redis事务的基石。一个Redis事务允许一组Redis命令单步执行,并提供下面两个重要保证:一个事务中的所有命令串行执行;要么全部命令要么没有任何命令被处理。具体可参开这篇文章:http://blog.xiping.me/2010/12/transaction-in-redis.html
(4) Redis客户端
Redis支持非常各种语言的客户端,具体参:http://redis.io/clients
原创文章,转载请注明: 转载自董的博客
本文链接地址: http://dongxicheng.org/nosql/redis-code-basic-points/
作者:Dong,作者介绍:http://dongxicheng.org/about/
本博客的文章集合:http://dongxicheng.org/recommend/
(3)支持事务
MULTI, EXEC, DISCARD 和 WATCH 命令是Redis事务的基石。一个Redis事务允许一组Redis命令单步执行,并提供下面两个重要保证:一个事务中的所有命令串行执行;要么全部命令要么没有任何命令被处理。具体可参开这篇文章:http://blog.xiping.me/2010/12/transaction-in-redis.html
(4) Redis客户端
Redis支持非常各种语言的客户端,具体参:http://redis.io/clients
原创文章,转载请注明: 转载自董的博客
本文链接地址: http://dongxicheng.org/nosql/redis-code-basic-points/
作者:Dong,作者介绍:http://dongxicheng.org/about/
本博客的文章集合:http://dongxicheng.org/recommend/
Redis源码研究—基础知识的更多相关文章
- Redis源码研究--字典
计划每天花1小时学习Redis 源码.在博客上做个记录. --------6月18日----------- redis的字典dict主要涉及几个数据结构, dictEntry:具体的k-v链表结点 d ...
- Redis源码研究--启动过程
---------------------6月23日--------------------------- Redis启动入口即main函数在redis.c文件,伪代码如下: int main(int ...
- Redis源码研究:哈希表 - 蕫的博客
[http://dongxicheng.org/nosql/redis-code-hashtable/] 1. Redis中的哈希表 前面提到Redis是个key/value存储系统,学过数据结构的人 ...
- Redis源码研究--redis.h
------------7月3日------------ /* The redisOp structure defines a Redis Operation, that is an instance ...
- Redis源码研究--跳表
-------------6月29日-------------------- 简单看了下跳表这一数据结构,理解起来很真实,效率可以和红黑树相比.我就喜欢这样的. typedef struct zski ...
- Redis源码研究--字符串
之前看的内容,占个位子,以后补上. ------------8月2日------------- 好久没看了,惭愧,今天抽了点时间重新看了Redis的字符串,一边写博客,一边看. Redis的字符串主要 ...
- Redis源码研究--双向链表
之前看的内容,占个位子,以后补上. ----------8月4日--------------- 双向链表这部分看的比较爽,代码写的中规中矩,心里窃喜,跟之前学的<数据结构>这本书中差不多. ...
- 曹工说Redis源码(2)-- redis server 启动过程解析及简单c语言基础知识补充
文章导航 Redis源码系列的初衷,是帮助我们更好地理解Redis,更懂Redis,而怎么才能懂,光看是不够的,建议跟着下面的这一篇,把环境搭建起来,后续可以自己阅读源码,或者跟着我这边一起阅读.由于 ...
- 从源码研究如何不重启Springboot项目实现redis配置动态切换
上一篇Websocket的续篇暂时还没有动手写,这篇算是插播吧.今天讲讲不重启项目动态切换redis服务. 背景 多个项目或微服务场景下,各个项目都需要配置redis数据源.但是,每当运维搞事时(修改 ...
随机推荐
- 基于prometheus监控k8s集群
本文建立在你已经会安装prometheus服务的基础之上,如果你还不会安装,请参考:prometheus多维度监控容器 如果你还没有安装库k8s集群,情参考: 从零开始搭建基于calico的kuben ...
- 奶瓶(beini)破解无线密码流程:安装、抓包、从虚拟机(VMware)拷贝握手包(拷贝到硬盘、U盘)、跑包
1. 环境 1). Windows 7 64位版本 2). VMware 9.0.2版本 3). 奶瓶1.2.3版本(beini-1.2.3.iso) 2. 安装 2.1 安装方式一 将beini-1 ...
- 关于Suppressing notification from package com.xxx.xxx by user request.的异常
其实以下都是废话. 如果你的测试的真机或者是模拟器是android4.1以上, 就有可能遇到这个Toast或者通知不能弹出. 自己不懂为什么. 想想你自己的应用设置是否有勾上这个 没有的话.就活该显示 ...
- Java Web(六) EL表达式
这也是属于JSP范围内的知识,使用EL表达式,能更好的使用JSP中的各种内置对象和作用域,说点闲话,马上要出去实习了,有点恐慌,可能这是马上要出去工作的学生的通病,继续努力把,兵来将挡水来土掩, -- ...
- [svc]java初步
J2EE.J2SE 和 J2ME 三者的区别有哪些? J2SE, 主要是桌面软件开发,包括swing 等.是后面2个的基础,但是我们不用它做桌面开发.只学习语法. J2EE,网站开发,servlet. ...
- create-react-app 使用详解
快速开始 npm install -g create-react-app create-react-app my-app cd my-app/ npm start 通过http://localhost ...
- tengine 增加ngx_http_cache_purge_module 模块
wget http://labs.frickle.com/files/ngx_cache_purge-2.1.tar.gz tar zxvf ngx_cache_purge-2.1.tar.gz -- ...
- 菜鸟学SSH(十四)——Spring容器AOP的实现原理——动态代理
之前写了一篇关于IOC的博客——<Spring容器IOC解析及简单实现>,今天再来聊聊AOP.大家都知道Spring的两大特性是IOC和AOP,换句话说,容器的两大特性就是IOC和AOP. ...
- android studio - Indexing paused due to batch updated
傻逼的 Android Studio 又开抽疯了.... 日 打开项目就出现 Indexing paused due to batch updated ,并且半天没反应........ 解决办 ...
- jQuery中 index() 方法的使用
假设一个集合中有10个元素,源生js在添加事件的时候,会使用for循环,里面的i的值,就是当前点击元素是集合中的第i个元素.在jquery中,获得i的值的方法如下: <ul id="a ...