目录
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 是一个把数据存储在内存中的高速缓存,用来在应用和数据库间提供缓冲,替代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,使用跳跃表的结构可以获得比较高的查找效率,并且在实现上比较简单
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.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/predis https://github.com/Shumkov/Rediska https://github.com/jdp/redisent http://www.cnblogs.com/ikodota/archive/2012/03/05/php_redis_cn.html http://blog.51yip.com/cache/1439.html http://www.cnblogs.com/jackluo/p/3412670.html
0x2: Java连接Redis
Relevant Link:
http://outofmemory.cn/code-snippet/128/java-usage-redis-jiandan-usage http://www.cnblogs.com/edisonfeng/p/3571870.html
Copyright (c) 2014 LittleHann All rights reserved
Redis Installation、Configuration、Program Based On Redis Learning,布布扣,bubuko.com
时间: 2024-10-21 09:24:36