Redis文档
1 Redis
1.1 简介
redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、hash(哈希)、list(链表)、set(集合)和zset(有序集合)。这些数据类型都支持push/pop、add/remove及取交集并集 和差集及更丰富的操作,而且这些操作都是原子性的。
在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别 的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master- slave(主从)同步。
Redis 是一个高性能的key-value数据库。Nosql(非关系型数据库)
Redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部 分场合可以对关系数据库起到很好的补充作用。它提供了Python,Ruby,Erlang,PHP客户端,使用很方便
2 PHP安装Redis扩展
使用phpinfo()函数查看PHP的版本信息,这会决定扩展文件版本。
下载redis扩展文件(一 定要保证版本的正确性)
下载地址:(选择适合的版本否则不会生效)
http://windows.php.net/downloads/pecl/snaps/redis/ http://windows.php.net/downloads/pecl/releases/igbinary/
注:如果在phpinfo()里看到TS则选择ts版本,如果是NTS则下载nts版本
如上图则下载:php_redis-4.2.0-7.3-ts-vc15-x86.zip
解压后,将php_redis.dll和php_redis.pdb拷贝至php的ext目录下
修改php.ini,在该文件中加入:extension=php_redis.dll
注意:extension=php_redis.dll一定要放在extension=php_igbinary.dll的前面,否则此扩展不会生效
重启Apache后,使用phpinfo查看扩展是否成功安装
3 Redis的使用
3.1 PHP中使用Redis
$redis = new Redis (); //实例化Redis
$redis->connect ("localhost", 6379); //连接
$redis->select (库的索引值); //选库(0~15)
$redis->set ('key', 'value'); //存储数据
echo $redis->get ("key"); //获取
3.2 cmd中使用redis
然后再命令命令行下输入 cd/redis 注:redis就是你的安装路径
然后输入 redis-cli 连接到redis,然后就可以对redis进行操作了
4 Redis的使用命令
4.1 字符串类型
4.1.1 命令
格式:set 键 值
例如:set key value
格式:get 键
例如:get key
3. setnx命令:设置一个不存在的键和值(防止覆盖)
格式:setnx key value 若key已存在则返回0表示失败成功返回1
4. setex命令:设置一个指定有效期的键和值(单位秒),成功返回ok
格式:setex 键 [有效时间] 值到期后获取则无返回值
例如:setex key 10 value
不写有效时间则表示永久有效,等价于set
5. setrange命令:替换子字符串 (替换长度由子子串长度决定)
格式:setrange 键 位置(从0开始) 子字串
例如:setrange key 1 a将key键对应值的第0个位置后开始替换成功则返回2
6. mset命令:批量设置键和值,成功则返回ok
例如:mset key1 value1 key2 value2 key3 value3
7. msetnx命令:批量设置不存在的键和值,成功则返回1,失败返回0
例如:msetnx key1 value key2 value2 key3 value3
8. getset命令:获取原值,并设置新值成功后返回原值
例如:getset key value
9. getrange命令:获取指定范围的值
例如:getrange key 0 4获取指定0到4位置上的值
10. mget命令: 批量获取值
例如:mget key1 key2 key3
11. incr命令: 指定键的值做加加操作,返回加后的结果
例如:incr key
12. incrby命令: 设置某个键加上指定值
例如:incrby key m其中m可以是正整数或负整数(加减操作)
13. decr命令: 指定键的值做减减操作,返回减后的结果。
例如:decr key
14. decrby命令: 设置某个键减上指定
例如:decrby key m其中m可以是正整数或负整数
15. append命令:给指定key的字符串追加value,返回新字符串值的长度
16. strlen 获取字符串的长度
4.1.2 应用场景
String类型是最基础的一种key-value存储形式,value其实不仅仅可以是String,也可以是数值类型。常常用来做计数器这类自增自减的功能,可用在粉丝数、微博数等。
4.2 哈希类型(hash)
Redis hash 是一个键值(key => value)对集合。Redis hash 是一个 string 类型的 field 和 value 的映射
表,hash 特别适合用于存储对象。
Hash表也称散列表,也有直接译作哈希表,Hash表是一种特殊的数据结构,它能够快速定位到想要查找的记录,根据哈希的表名,直接定位
结构如下:
4.2.1 命令
1. hset命令:设置一个哈希表的键和值成功则返回1
例如:hset key field value
2. hsetnx命令:设置一个哈希表中不存在的键
格式:hsetnx hash名 键 值 成功返回1,失败返回0
例如:hsetnx key field value
3. hmset命令:批量设置,成功返回ok
格式:hmset key field1 value1 field2 value2
4. hmget命令:批量获取
格式:hmget hash名(hash表名) 键1 键2 键3
例如:hmget key field1 field2 field3
5. hget命令: 获取执行哈希名中的键对应值
格式:hget hash名 键
例如:hget key field
6. hlen key 获取某哈希key名中键的数量
7. hdel key field 删除哈希key中find键
8. del key 删除当前hash表数据,成功返回1
9. hkeys key 返回哈希名为key中的所有键。
10. hvals key 返回哈希名为key中的所有值。
11. hgetall key 返回哈希名为key中的所有键和值。
12. hexists key field 查看哈希名为key 的field 是否存在,若存在返回1不存在则返回0
4.2.2 应用场景
4.3 链表类型(list)
在Redis中,List类型是按照插入顺序排序的字符串链表。和数据结构中的普通链表一样,
List中可以包含的最大元素数量是4294967295。
从元素插入和删除的效率视角来看,如果我们是在链表的两头插入或删除元素,这将会是非常高效的操作, 即使链表中已经存储了百万条记录,该操作也可以在常量时间内完成。然而需要说明的是,
如果元素插入或删除操作是作用于链表中间,那将会是非常低效的。结构如下:
4.3.1 命令
1. lpush list value 在list头部压入一个值,返回list中元素的总个数
2. lrange list 0 -1 获取list中内容0:表示开头 -1表示结尾。
3. rpush list value 在list尾部压入一个字串,返回list中元素的总个数
4. linsert list before value value1 在对应list的特定位置前添加一个元素成功返回列表长度,如果没有找到指定元素 ,返回 -1 。 如果 key 不存在或为空列表,返回 0 。
5. linsert list after value value1 在list的特定位置后添加一个元素成功返回列表长度,如果没有找到指定元素 ,返回 -1 。 如果 key 不存在或为空列表,返回 0 。
6. lset list 1 value 修改指定索引位置上的值,从0开始数把第1个值改成value,成功返回ok
7. lrem list 2 value 删除前两个为value的值,成功返回1
8. lrem list -2 value 删除后两个为value的值,成功返回1
9. lrem list 0 value 删除所有value1值,成功返回1
10. ltrim list 0 5 删除(0-5)此范围外的值,成功返回ok
11. lpop list 从list的头部删除元素,并返回删除元素
12. rpop list 从list的尾部删除元素,并返回删除元素
13. rpoplpush list1 list2 将list1的尾部一个元素移出到list2头部。并返回移出的值
14. lindex list 1 返回list中索引位置上的元素
15. llen list 返回list的长度
4.3.2 应用场景
list就是链表,略有数据结构知识的人都应该能理解其结构。使用Lists结构,我们可以轻松地实现最新消息排行等功能。List的另一个应用就是消息队列,可以利用List的PUSH操作,将任务存在List中,然后工作线程再用POP操作将任务取出进行执行。
Redis的list是每个子元素都是String类型的双向链表,可以通过push和pop操作从列表的头部或者尾部添加或者删除元素,这样List即可以作为栈,也可以作为队列
4.4 set(集合)
在Redis中,我们可以将Set类型看作为没有排序的字符集合,和List类型一样,我们也可以在该类型的数据值上执行添加、删除或判断某一元素是否存在等操作。
zset是在set的基础上增加了顺序,形成一个有序的集合
结构如下:
4.4.1 命令
1. sadd key value 向key中添加一个元 素成功返回1,失败(重复)返回0
2. smembers key获取key中的所有元素
3. srem key value 从key中删除一个value成功返回1,失败(不存在)返回0
4. spop key m随机返回并删除key中的m个元素
5. sdiff key1 key2 返回两个集合的差集以key1为标准,获取key2中不存在的。
6. scard key 获取key集合里面的元素数量。如果key对应的值不是集合类型的则报错。
7. sinter key1 key2 返回key1和key2两个集合的交集。
8. smove key1 key2 a 移除指定集合中的元素到目标集合中,如果目标集合中存在该元素则仅仅进行移除(把key1中的 a 移除到 key2中)成功返回1失败返回0
4.4.2 应用场景
共同好友、 利用唯一性,统计访问网站的所有独立ip 、好友推荐时,根据tag求交集,大于某个阈值就可以推荐
4.5 zset(有序集合)
Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员,不同的是每个元素都会关联一个double类型的分数。
redis正是通过分数来为集合中的成员进行从小到大的排序。
有序集合的成员是唯一的,但分数(score)却可以重复
4.5.1 命令
1. zadd key 99 value …将一个或多个成员元素加入到有序集当中按权重从小到大排序
格式:zadd key 权重值 value
例如:zadd key 1 one 2 two
2. zcard key 获取集合中的成员数量
3. zcount key 90 100 获取集合中权重在 90到100 的成员数量
4. zincrby key increment member 有序集合中对指定成员的权重加上增量 increment,如果没有这个成员则会设置一个新成员返回成员的权重值
例如:zincrby key 2 two 给two的权重加2
5. zrange key start end返回名称为key 的集合按 权重从大到小排序
例如:zrevrange key 0 -1 // 0 表示有序集第一个成员,以 1 表示有序集第二个成员,以此类推,也可以使用负数下标,以 -1 表示最后一个成员, -2 表示倒数第二个成员,以此类推
6. zrevrange key start end返回名称为 key 的 集合按 权重从大到小排序
7. zrank key member返回名称为 key 的集合中元素的排名(按 score 从小到大排序)即下标
8. zrevrank key member返回名称为 key 的集合中元素的排名(按 score 从大到小排序)即下标
9. zrem key member移除集合中指定成员,可以指定多个,成功返回1
10. zremrangebyrank key start stop 移除集合中,指定排名(下标)区间内的所有成员
11. zrevrange key min max移除集合中,指定排名(权重)区间内的所有成员
12. zscore key value 返回指定成员的权重值
4.5.2 应用场景
游戏积分排名、微博热门话题、热卖商品等
4.6 其它常用命令
1. keys list* 返回名以list开头的所有键(key)
2. exists key 判断键名为key的是否存在存在返回1, 不存在返回0
3. del key 删除一个键(名为key)成功则返回1
4. expire key 10 设置键名为key的过期时间为10秒后
5. ttl key 查看键名为key的过期时间,若为-1表示永久