本文共 18191 字,大约阅读时间需要 60 分钟。
[TOC]
Redis是一个开源(BSD许可),内存存储的数据结构服务器,可用作数据库,高速缓存和消息队列代理。 它支持字符串、哈希表、列表、集合、有序集合,位图,hyperloglogs等数据类型。 内置复制、Lua脚本、LRU收回、事务以及不同级别磁盘持久化功能,同时通过Redis Sentinel提供高可用,通过Redis Cluster提供自动分区。 简言之,Redis是一种面向“键/值”对数据类型的内存数据库,可以满足我们对海量数据的快速读写需求。 Redis是一款NoSQL产品。 官网:http://www.redis.io 或者:http://redis.cn/
Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。Redis不仅仅支持简单的k-v类型的数据,同时还提供list,set,zset,hash等数据结构的存储。Redis支持数据的备份,即master-slave主从模式的数据备份。
性能极高——Redis读的速度为11w/s,写的速度为8.1w/s。丰富的数据类型——Redis支持二进制案例的Strings,Lists,Hashes,Sets即Ordered Sets数据类型操作。原子性——Redis的所有操作都是原子性的,同时Redis还支持对几个操作合并后的原子性执行。丰富的特性——Redis还支持public/subscribe,通知,key过期等特性。
应用在高并发和实时请求的场景,eg新浪微博hash:关注列表,粉丝列表string:微博数,粉丝数(避免使用select count(*) from...)sorted set:TopN,热门微博还有github,stackoverflow也用到了redis
windows下直接解压即可使用,主要说明Linux下的安装方式 :
解压:tar -zxvf soft/redis-3.2.0.tar.gz -C app/重命名:mv app/redis-3.2.0/ app/redis编译:make安装:make install PREFIX=/home/uplooking/app/redis
初始配置 修个redis.conf中的配置项 bind uplooking01 daemonize yes(后台运行) logfile /opt/redis-3.2.0/logs/redis.log(日志文件,目录必须存在)启动服务 make完成之后,在redis-3.2.0/src目录下会出现编译后的redis服务器程序redis-server,还有用于测试的客户端程序redis-cli。 redis-3.2.0]$ src/redis-server redis.conf 当然,如果再执行了make install则会在指定安装目录下生成一个bin目录,同时也会有相关的命令用于操作Redis.启动客户端 redis-3.2.0]$ src/redis-cli -h localhost -p 6379关闭服务 ps -ef | grep redis 找到进程id后直接kill -9就可以了。
Redis的配置文件位于Redis的安装目录之下,文件名为redis.conf。可以通过config命令来查看或设置配置项。
查看 语法,Redis config命令格式如下: redis localost:6379> config get config_set_name eg: redis localost:6379> config get loglevel 1) "loglevel" 2) "notice" 使用*号获取所有配置项:redis localost:6379> config get *编辑 可以通过修改redis.conf文件或使用config set命令来修改配置 基本语法: redis localost:6379> config set conf_setting_name new_value eg: redis localost:6379> config set loglevel "warning" redis localost:6379> config get loglevel 1) "loglevel" 2) "warning" -->对当前服务有效,之后当服务重启之后,才会失效
string是redis最基本的类型,你可以理解成与memcached一模一样的类型,一个key对应一个value。 string类型是二进制安全的。意思是redis的string可以包含任何数据。比如jpg图片或者序列化的对象 。 string类型是Redis最基本的数据类型,一个键最大能存储512MB。实例 redis 127.0.0.1:6379> SET name "redis.net.cn"OK redis 127.0.0.1:6379> GET name"redis.net.cn" 在以上实例中我们使用了Redis的SET和GET命令。键为name,对应的值为redis.net.cn。注意:一个键最大能存储512MB。
常见的string操作命令如下:
set key value 设置指定key的值(会覆盖无视数据类型) set name yaohuiyingget key 获取指定key的值 get namegetrange key start end 返回key中字符串值的子字符 getrange name 1 4 注意:字符串索引从0开始,获取索引片段[start, end],包头包尾getset key value 将给定key的值设为value,并返回key的旧值(old value) getset name liuxiangqian 返回值为yaohuiyingmget key1 [key2..] 获取所有(一个或多个)给定key的值 mget name name1setex key seconds value 将值value关联到key,并将key的过期时间设为seconds(以秒为单位)setnx key value 只有在key不存在时设置key的值 作用同set,唯一和set的区别在于,只有当key不存在的时候,才进行设置, 而key存在,无法完成覆盖setrange key offset value 用value参数覆写给定key所储存的字符串值,从偏移量offset开始 对key的原先的value进行局部覆盖,从offset偏移量开始, value有多长,就覆盖多长strlen key 返回key所储存的字符串值的长度mset key value [key value ...] 同时设置一个或多个key-value对MSETNX key value [key value ...] 同时设置一个或多个key-value对,当且仅当所有给定key都不存在psetex key milliseconds value 这个命令和SETEX命令相似,但它以毫秒为单位设置key的生存时间, 而不是像SETEX命令那样,以秒为单位incr key 将key中对应储存的数字值增一 对key对应的value进行+1,但是value必须是数字类型的字符串INCRBY key increment 将key所储存的值加上给定的增量值(increment) 之定义的步长incrbyfloat key increment 将key所储存的值加上给定的浮点增量值(increment)decr key 将key中储存的数字值减一decrby key decrement key 所储存的值减去给定的减量值(decrement)append key value 如果key已经存在并且是一个字符串, APPEND命令将value追加到key原来的值的末尾
Redis hash 是一个键值对集合。Redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象。实例redis 127.0.0.1:6379> HMSET w3ckey name "redis tutorial" description "redis basic commands for caching" likes 20 visitors 23000OKredis 127.0.0.1:6379> HGETALL w3ckey1) "name"2) "redis tutorial"3) "description"4) "redis basic commands for caching"5) "likes"6) "20"7) "visitors"8) "23000"以上实例中 hash 数据类型存储了一些描述信息(name,description, likes, visitors)到hash的w3ckey中。 使用hgetall 获取所有的内容。每个hash可以存储232-1键值对(40多亿)。
常用命令操作如下:
hexists key field 查看hash表key中,指定字段是否存在 0表示没有,1表示有hget key field 获取hash表中指定字段的值hgetall key 获取所有的字段和值hincrby key field increment 为指定字段的整数值加上增量incrementhincrbyfloat key field increment 为指定字段的浮点值加上增量incrementhkeys key 获取所有的字段hlen key 获取key的字段的数量hdel key field2 [field2] 删除一个或多个哈是表字段hmget key field1 [field2] 获取所有给定字段的值hmset key f1 v1 [f2 v2] 同时将多个file-value设置到key中hset key field value 将哈希表key的field设置为valuehsetnx key field value 当在field不存在时,设置相关字段的值hvals key 获取所有的值hscan key cursor [MATCH pattern] [COUNT count] 迭代哈希表中的键值对
Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。实例redis 127.0.0.1:6379> lpush redis.net.cn redis(integer) 1redis 127.0.0.1:6379> lpush redis.net.cn mongodb(integer) 2redis 127.0.0.1:6379> lpush redis.net.cn rabitmq(integer) 3redis 127.0.0.1:6379> lrange redis.net.cn 0 101) "rabitmq"2) "mongodb"3) "redis"redis 127.0.0.1:6379>列表最多可存储 232-1元素 (4294967295, 每个列表可存储40多亿)。
常用操作命令如下:
注意:关于list的操作,可以分为从左边操作,也可以从右边进行操作l--->left(头部),r---->right(尾部)blpop key1 [key2 ] timeout 移除并获取列表中的第一个元素,如果没有会阻塞列表直到超时【单位是秒s】 或发现可弹出元素为止 简言之就是删除key1 key2.。。中的元素,如果没有元素则阻塞,结束条件为 要么时间超过了timeout;要么发现有新的元素进来brpop key1 [key2 ] timeout 移除并获取列表中的最后一个元素,如果没有会阻塞列表直到超时或发现可弹出 元素为止 同blpop,不同在于删除元素的方向不一致brpoplpush source destination timeout 从列表中弹出一个值,将弹出的元素插入到另外一个列表中并返回 它,如果没有元素会阻塞列表知道等待超时或发现可弹出元素为止 uplooking01:6379> brpoplpush season season1 100 "spring" (7.59s)lindex key index 通过索引获取列表中的元素 注意一个: lindex key -1获取的是最后一个元素linsert key before|after pivot value 在列表的元素前或后插入元素 uplooking01:6379> lrange season 0 -1 1) "winter" 2) "autumn" 3) "summer" uplooking01:6379> linsert season after summer spring (integer) 4 uplooking01:6379> lrange season 0 -1 1) "winter" 2) "autumn" 3) "summer" 4) "spring"llen key 获取列表长度,列表大小lpop key 移出并获取列表的第一个元素lpush key value1 [value2] 将一个或多个值插入到列表头部lpushx key value 将一个或多个值插入到已存在的列表头部lrange key start stop 获取列表指定返回内的元素 [start, stop] 如果要出去lrange中的所有的元素的话 lrange key 0 -1lrem key count value 移出列表元素 count > 0: 从头往尾移除值为 value 的元素,1时,表示移除1个元素 count < 0: 从尾往头移除值为 value 的元素,-2时,表示移除2个元素 count = 0: 移除所有值为 value 的元素。lset key index value 通过索引设置列表元素的值(list.set(i, value)) 需要大家注意的是一个特殊的索引-1,表示最后一个元素ltrim key start stop 对一个列表进行修剪(trim),也就是说,让列表只保留指定区间内的元素, 删除其它元素 [start, stop] uplooking01:6379> lrange season 0 -1 1) "winter" 2) "autumn" 3) "summer" 4) "spring" uplooking01:6379> ltrim season 1 2 OK uplooking01:6379> lrange season 0 -1 1) "autumn" 2) "summer"rpop key 移出并获取列表最后一个元素rpoplpush source destination 移出列表的最后一个元素,并将该元素添加到另一列表并返回rpush key value1 [value2] 在列表中添加一个或多个值rpushx key value 为已存在的列表添加值
Redis的Set是string类型的无序集合。 集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。sadd命令 添加一个string元素到,key对应的set集合中,成功返回1,如果元素已经存在集合中返回0,key对应的set不存在返回错误。sadd key member实例redis 127.0.0.1:6379> sadd redis.net.cn redis(integer) 1redis 127.0.0.1:6379> sadd redis.net.cn mongodb(integer) 1redis 127.0.0.1:6379> sadd redis.net.cn rabitmq(integer) 1redis 127.0.0.1:6379> sadd redis.net.cn rabitmq(integer) 0redis 127.0.0.1:6379> smembers redis.net.cn1) "rabitmq"2) "mongodb"3) "redis" 注意:以上实例中 rabitmq 添加了两次,但根据集合内元素的唯一性,第二次插入的元素将被忽略。 集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。
常用操作命令如下:
sadd key member1 [member2] 向集合添加一个或多个成员scard key 获取集合的成员数(size)sdiff key1 [key2] 返回给定所有集合的差集 集合A={1, 2, 3, 4, 5} 集合B={2, 3, 6, 8} A∩B = {2, 3} A∪B = {1, 2, 3, 4, 5, 6, 8} A-B(差集) = {1, 4, 5, 6, 8} {1, 4, 5}√ uplooking01:6379> sdiff A B 1) "1" 2) "4" 3) "5"sdiffstore dest key1 [key2] 返回并保存给定集合差集保存到dest中 uplooking01:6379> sdiffstore tmp A B (integer) 3 uplooking01:6379> smembers tmp 1) "1" 2) "4" 3) "5"sinter key1 [key2] 返回给定集合的交集 uplooking01:6379> sinter A B 1) "2" 2) "3"sinterstore dest key1 [key2] 返回并保存给定集合的交集到dest中sismember key member 判断member元素是否是集合key的成员 uplooking01:6379> sismember A 3 (integer) 1 uplooking01:6379smembers key 返回集合中所有成员smove src dest member 将member元素从src移动到dest中spop key 移除并返回集合中的一个随机元素srandmember key [count] 返回集合中一个或多个随机数 随机返回集合key中的count个元素,没有count,返回1个 uplooking01:6379> srandmember A "1" uplooking01:6379> srandmember A 2 1) "3" 2) "4"srem key member1 [member2] 移除集合中一个或多个成员sunion key1 [key2] 返回所有给定集合的并集---就是数学中的并集的概念 uplooking01:6379> sunion A B 1) "1" 2) "2" 3) "3" 4) "4" 5) "5" 6) "6" 7) "8"sunionstore dest key1 [key2] 返回并保存给定集合的并集到destsscan key cursor [match pattern] [count count] 迭代集合中的元素
Redis zset和set一样也是string类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。 zset的成员是唯一的,但分数(score)却可以重复。 zadd命令 添加元素到集合,元素在集合中存在则更新对应score zadd key score member 实例redis 127.0.0.1:6379> zadd redis.net.cn 0 redis(integer) 1redis 127.0.0.1:6379> zadd redis.net.cn 0 mongodb(integer) 1redis 127.0.0.1:6379> zadd redis.net.cn 0 rabitmq(integer) 1redis 127.0.0.1:6379> zadd redis.net.cn 0 rabitmq(integer) 0redis 127.0.0.1:6379> ZRANGEBYSCORE redis.net.cn 0 10001) "redis"2) "mongodb"3) "rabitmq"
常用操作命令如下:
zadd key score1 member1 [score2 member2] 想有序集合添加一个或多个成员, 或是更新已经存在成员的分数 uplooking01:6379> zadd website 0.01 www.uplooking.com (integer) 1 uplooking01:6379> zadd website 0.05 www.baidu.com (integer) 1 uplooking01:6379> zadd website 0.1 www.google.com (integer) 1 uplooking01:6379> zadd website 1 www.taobao.com (integer) 1 uplooking01:6379> zadd website 0.005 www.jd.com (integer) 1zcard key 获取有序集合的成员数 uplooking01:6379> zcard website (integer) 5zcount key min max 计算在有序集合中指定区间分数的成员数 获取分数区间[min, max]中元素 uplooking01:6379> zcount website 0.01 0.1 (integer) 3zincrby key increment member 有序集合中对指定成员的分数上增量incr uplooking01:6379> zincrby website 0.01 www.uplooking.com "0.02" zinterstore dest nkeys key [key..] 计算给定的一个或多个有序集的交集并保存在新的有序集合dest中zlexcount key min max 在有序集合中计算指定字典区间内成员数量 需要清楚的是 可以使用-代表,得分最小的元素,使用+代表得分最大的元素 zlexcount key - + 得到就是集合的size min===>[member1 max===>[member2 得到的元素个数就是在区间[member1, member2]内的元素个数 redis> ZADD myzset 1 a 2 b 3 c 4 d 5 e 6 f 7 g (integer) 7 redis> zrange myzset 0 -1 1) "a" 2) "b" 3) "c" 4) "d" 5) "e" 6) "f" 7) "g" redis> ZLEXCOUNT myzset - + (integer) 7 redis> ZLEXCOUNT myzset [c + (integer) 5 redis> ZLEXCOUNT myzset - [c (integer) 3 redis> zrange key start stop [withscores] 通过索引区间返回有序集合成指定区间内的成员 特殊的一个写法zrange key 0 -1返回所有的元素zrangebylex key min max [limit offset count] 通过字典区间返回有序集合的成员zrangebyscore key min max [withscores] [limit] 通过分数返回有序集合指定区间内的成员zrank key member 返回有序集合中指定成员的索引zrem key member [member ...] 移除有序集合中的一个或多个成员 返回1,删除成功,返回0,没有这个元素zremrangebylex key min max 移除有序集合中给定的字典区间的所有成员zremrangebyrank key start stop 移除key中给定的排名区间的所有成员 排名就是索引zremrangebyscore key start stop 移除key中给定的分数区间的所有成员 分数就是scorezrevrange key start stop [withscores] 返回有序key中指定区间内的成员,通过索引,分数从高到低 和zrange key start stop反过来zrevrangebysocre key max min [withscores] 返回有序key中指定分数区间内的成员,通过索引,分数从高到低zrevrank key memeber 返回key中指定成员的排名,key成员按分数值递减排序zscore key member 返回key中member的分数zunionstore dest numkeys key [key...] 计算给定的一个或多个有序集的并集,并存储到新的dest中zscan key cursor [match pattern] [count count] 迭代有序集合中的元素(包括元素成员和元素分值) uplooking01:6379> zscan website 1 1) "0" 2) 1) "www.jd.com" 2) "0.0050000000000000001" 3) "www.uplooking.com" 4) "0.02" 5) "www.baidu.com" 6) "0.050000000000000003" 7) "www.taobao.com" 8) "1"
keys * 列举出所有的keytype key 获取对应key的数据类型select [0-15] 切换到某一个数据库中rename oldKey newKey 将oldKey重命名为newKey终端中属于密码的两种方式: 第一种: 连接的时候:redis-3.2.0]# src/redis-cli -h uplooking03 -a uplooking 第二中: 登陆之后再输入密码: auth uplooking(密码)停止redis服务的命令: src/redis-cli -h uplooking01 -p 6379 shutdown 1、键值相关命令 keys * 取出当前所有的key exists name 查看redis是否有name这个key del name 删除key name expire confirm 100 设置confirm这个key100秒过期 ttl confirm 获取confirm 这个key的有效时长 select 0 选择到0数据库 redis默认的数据库是0~15一共16个数据库 move confirm 1 将当前数据库中的key移动到其他的数据库中, persist confirm 移除confirm这个key的过期时间 randomkey 随机返回数据库里面的一个key rename key2 key3 重命名key2 为key3 type key2 返回key的数据类型2、服务器相关命令 ping PONG返回响应是否连接成功 echo 在命令行打印一些内容 select 0~15 编号的数据库 quit /exit 退出客户端 dbsize 返回当前数据库中所有key的数量 info 返回redis的相关信息 config get dir/* 实时传储收到的请求 flushdb 删除当前选择数据库中的所有key flushall 删除所有数据库中的数据库
转载地址:http://hljga.baihongyu.com/