设为首页 收藏本站
查看: 714|回复: 0

[经验分享] Redis Installation、Configuration、Program Based On Redis Learning

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-7-20 12:53:30 | 显示全部楼层 |阅读模式
  目录



1. Redis 简介
2. Redis安装配置
3. 编程使用Redis
  
  1. Redis 简介
   DSC0000.png
  0x1: Redis是什么
  Redis是一款Nosql类型的基于key-value的高速缓存系统,
  从架构上看,redis有3种特性



1. key value store
是一个以key-value形式存储的数据库,定位直指MySQL,用来作为唯一的存储系统
2. memory cache
是一个把数据存储在内存中的高速缓存,用来在应用和数据库间提供缓冲,替代memcachd
3. data structrue server
把它支持对复杂数据结构的高速操作作为卖点,提供某些特殊业务场景的计算和展现需求。比如排行榜应用,Top 10之类的
  在redis的键值的"值"中,它所支持的数据结构有:



1. String
1) 常用命令
      set、get、decr、incr、mget等
      2) 应用场景
      String是最常用的一种数据类型,普通的key/value存储都可以归为此类
      3) 实现方式
      String在redis内部存储默认就是一个字符串,被redisObject所引用,当遇到incr、decr等操作时会转成数值型进行计算,此时redisObject的encoding字段为int
2. Hash
1) 常用命令
      hget、hset、hgetall等
      2) 应用场景
3) 实现方式
      Redis Hash对应Value内部实际就是一个HashMap,实际这里会有2种不同实现
3.1) 这个Hash的成员比较少时Redis为了节省内存会采用类似一维数组的方式来紧凑存储,而不会采用真正的HashMap结构,对应的value redisObject的encoding为zipmap
3.2) 当成员数量增大时会自动转成真正的HashMap,此时encoding为ht
3. List
1) 常用命令
      lpush、rpush、lpop、rpop、lrange等
      2) 应用场景
      Redis list的应用场景非常多,也是Redis最重要的数据结构之一,比如twitter的关注列表,粉丝列表等都可以用Redis的list结构来实现
      3) 实现方式
      Redis list的实现为一个双向链表,即可以支持反向查找和遍历,更方便操作,不过带来了部分额外的内存开销,Redis内部的很多实现,包括发送缓冲队列等也都是用的这个数据结构
4. Set
1) 常用命令
      sadd、spop、smembers、sunion等
      2) 应用场景
      Redis set对外提供的功能与list类似是一个列表的功能,特殊之处在于set是可以自动排重的,当你需要存储一个列表数据,又不希望出现重复数据时,set是一个很好的选择,并且set提供了判断某个成员是否在一个set集
合内的重要接口,这个也是list所不能提供的
      3) 实现方式:
      set的内部实现是一个value永远为null的HashMap,实际就是通过计算hash的方式来快速排重的,这也是set能提供判断一个成员是否在集合内的原因
5. Sorted set
1) 常用命令
      zadd、zrange、zrem、zcard等
      2) 使用场景
      Redis sorted set的使用场景与set类似,区别是set不是自动有序的,而sorted set可以通过用户额外提供一个优先级(score)的参数来为成员排序,并且是插入有序的,即自动排序。当你需要一个有序的并且不重复的集
合列表,那么可以选择sorted set数据结构,比如twitter 的public timeline可以以发表时间作为score来存储,这样获取时就是自动按时间排好序的
      3) 实现方式
      Redis sorted set的内部使用HashMap和跳跃表(SkipList)来保证数据的存储和有序,HashMap里放的是成员到score的映射,而跳跃表里存放的是所有的成员,排序依据是HashMap里存的score,使用跳跃表的结构可以获
得比较高的查找效率,并且在实现上比较简单
DSC0001.jpg
  Redis内部使用一个redisObject对象来表示所有的key和value



1. type
代表一个value对象具体是何种数据类型
2. encoding
不同数据类型在redis内部的存储方式,比如:type=string代表value存储的是一个普通字符串,那么对应的encoding可以是raw或者是int,如果是int则代表实际redis内部是按数值型类存储和表示这个字符串的,当然前提是这个
字符串本身可以用数值表示,比如:"123" "456"这样的字符串
3. ptr
数据指针
4. vm
只有打开了Redis的虚拟内存功能,此字段才会真正的分配内存,该功能默认是关闭状态的
  我们可以发现Redis使用redisObject来表示所有的key/value数据是比较浪费内存的,当然这些内存管理成本的付出主要也是为了给Redis不同数据类型提供一个统一的管理接口
  Relevant Link:




http://try.redis.io/
http://www.redis.cn/
http://jandyu.diandian.com/post/2012-03-15/16145594
http://tech.it168.com/a2011/0818/1234/000001234478_all.shtml
http://hedatou.com/archives/introduction_to_redis.html
  
  2. Redis安装配置
  0x1: 主程序安装



cd /usr/local
wget http://download.redis.io/releases/redis-2.8.13.tar.gz
tar xzf redis-2.8.13.tar.gz
cd redis-2.8.13
make
/*make命令执行完成后,会在当前src目录(/usr/local/redis-2.8.13/src)下生成本个可执行文件如下:
1. redis-server:Redis服务器的daemon启动程序
2. redis-cli:Redis命令行操作工具。当然,你也可以用telnet根据其纯文本协议来操作
3. redis-benchmark:Redis性能测试工具,测试Redis在你的系统及你的配置下的读写性能
4. redis-stat:Redis状态检测工具,可以检测Redis当前状态参数及延迟状况
*/
  0x2: 命令测试



//启动server
./redis-server
//测试benchmark
./redis-benchmark
//使用内置的客户端连接Redis
./redis-cli
127.0.0.1:6379> set foo bar
OK
127.0.0.1:6379> get foo
"bar"
127.0.0.1:6379>
  0x3: 运行Redis所需要的内核参数优化



/*
1. overcommit_memory
指定了内核针对内存分配的策略,其值可以是0、1、2。
0: 表示内核将检查是否有足够的可用内存供应用进程使用
1) 如果有足够的可用内存,内存申请允许
2) 否则,内存申请失败,并把错误返回给应用进程
1: 表示内核允许分配所有的物理内存,而不管当前的内存状态如何
2: 表示内核允许分配超过所有物理内存和交换空间总和的内存
*/
vim /etc/sysctl.conf
//添加
vm.overcommit_memory=1
//刷新配置使之生效
sysctl vm.overcommit_memory=1
  0x4: Redis配置文件



vim /usr/local/redis-2.8.13/redis.conf
//1. 开启守护进程
daemonize yes
//2. 每隔5秒输出一行监控信息(默认)
daemonize no
//3. 减小改变次数,这个参数可以根据情况进行指定
save 60 1000
//4. 分配256M内存
maxmemory 256000000  
//5. pid文件位置
pidfile /var/run/redis.pid
//6. 监听的端口号
port 6379
//7. 请求超时时间
timeout 0
//8. log信息级别
loglevel notice
//9. 开启数据库的数量
databases 16
/*
10. 保存快照的频率
1) 第一个*表示多长时间
2) 第二个*表示执行多少次写操作
在一定时间内执行一定数量的写操作时,自动保存快照。可设置多个条件
*/
save * *
//11. 是否使用压缩
rdbcompression yese
//12. 数据快照文件名(只是文件名,不包括目录)
dbfilename dump.rdb
//13. 数据快照的保存目录(这个是目录)
dir ./
//14. 是否开启appendonlylog,开启的话每次写操作会记一条log,这会提高数据抗风险能力,但影响效率
appendonly no
/*
15. appendonlylog如何同步到磁盘
1) always: 每次写都强制调用fsync
2) everysec: 每秒启用一次fsync
3) no: 不调用fsync等待系统自己同步
*/
appendfsync everysec
  配置好保存,重启redis,就可以正常启动了,和mysql一样,redis是基于socket监听端口的方式提供服务的,我们可以使用telnet、或者socket方式进行连接
  Relevant Link:



http://www.redis.cn/documentation.html
http://www.redis.cn/download.html
http://www.php100.com/html/webkaifa/PHP/PHPyingyong/2011/0406/7873.html
  
  3. 编程使用Redis
  0x1: PHP连接Redis
  使用php连接redis需要安装php的扩展



下载redis扩展源代码
http://pecl.php.net/package/redis
解压缩后进行编译
phpize
./configure --enable-hello
make
关于php扩展的原理以及编译过程请参阅另一篇文章
http://www.iyunv.com/LittleHann/p/3562259.html
将编译好的.so文件复制到php的扩展目录中
cp redis.so /usr/lib/php/modules/
修改php.ini中的extension,增加redis扩展的自动启动
重启apache即可
  Code



  
  Relevant Link:



https://github.com/nrk/predis
https://github.com/Shumkov/Rediska
https://github.com/jdp/redisent
http://www.iyunv.com/ikodota/archive/2012/03/05/php_redis_cn.html
http://blog.51yip.com/cache/1439.html
http://www.iyunv.com/jackluo/p/3412670.html
  0x2: Java连接Redis
  Relevant Link:



http://outofmemory.cn/code-snippet/128/java-usage-redis-jiandan-usage
http://www.iyunv.com/edisonfeng/p/3571870.html
  
  Copyright (c) 2014 LittleHann All rights reserved
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-88721-1-1.html 上篇帖子: Redis与Memcached的区别 下篇帖子: Redis' High Availability
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表