首页 > 代码库 > Redis Installation、Configuration、Program Based On Redis Learning
Redis Installation、Configuration、Program Based On Redis Learning
目录
1. Redis 简介2. Redis安装配置3. 编程使用Redis
1. Redis 简介
0x1: Redis是什么
Redis是一款Nosql类型的基于key-value的高速缓存系统,
从架构上看,redis有3种特性
1. key value store是一个以key-value形式存储的数据库,定位直指MySQL,用来作为唯一的存储系统2. memory cache是一个把数据存储在内存中的高速缓存,用来在应用和数据库间提供缓冲,替代memcachd3. 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字段为int2. 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为ht3. 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,使用跳跃表的结构可以获
得比较高的查找效率,并且在实现上比较简单
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/16145594http://tech.it168.com/a2011/0818/1234/000001234478_all.shtmlhttp://hedatou.com/archives/introduction_to_redis.html
2. Redis安装配置
0x1: 主程序安装
cd /usr/localwget http://download.redis.io/releases/redis-2.8.13.tar.gztar xzf redis-2.8.13.tar.gzcd redis-2.8.13make/*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-cli127.0.0.1:6379> set foo barOK127.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.htmlhttp://www.redis.cn/download.htmlhttp://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-hellomake关于php扩展的原理以及编译过程请参阅另一篇文章http://www.cnblogs.com/LittleHann/p/3562259.html将编译好的.so文件复制到php的扩展目录中cp redis.so /usr/lib/php/modules/修改php.ini中的extension,增加redis扩展的自动启动重启apache即可
Code
<?php $redis = new redis(); $result = $redis->connect(‘192.168.207.128‘, 6379); var_dump($result); //结果:bool(true) $result = $redis->set(‘name‘,"LittleHann"); var_dump($result); //结果:bool(true) $result = $redis->get(‘name‘); var_dump($result); //结果:LittleHann $redis->delete(‘name‘); var_dump($result); //结果:bool(true) ?>
Relevant Link:
https://github.com/nrk/predishttps://github.com/Shumkov/Rediskahttps://github.com/jdp/redisenthttp://www.cnblogs.com/ikodota/archive/2012/03/05/php_redis_cn.htmlhttp://blog.51yip.com/cache/1439.htmlhttp://www.cnblogs.com/jackluo/p/3412670.html
0x2: Java连接Redis
Relevant Link:
http://outofmemory.cn/code-snippet/128/java-usage-redis-jiandan-usagehttp://www.cnblogs.com/edisonfeng/p/3571870.html
Copyright (c) 2014 LittleHann All rights reserved
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。