Redis入门
Redis
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
Redis 与其他 key - value 缓存产品有以下三个特点: Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。 Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。 Redis支持数据的备份,即master-slave模式的数据备份。 Redis 优势 性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。 丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。 原子 – Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。 丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。 redis是一个数据库 redis是一个内存数据库, 所有数据基本上都存在于内存当中, 会定时以追加或者快照的方式刷新到硬盘中. 由于redis是一个内存数据库, 所以读取写入的速度是非常快的, 所以经常被用来做数据, 页面等的缓存。 注意:Redis支持多个数据库,并且每个数据库的数据是隔离的不能共享,并且基于单机才有,如果是集群就没有数据库的概念。 每个数据库对外都是一个从0开始的递增数字命名,Redis默认支持16个数据库(可以通过配置文件支持更多,无上限),可以通过配置databases来修改这一数字。客户端与Redis建立连接后会自动选择0号数据库,不过可以随时使用SELECT命令更换数据库, SELECT 1 #切换到1号数据库 最重要的一点是多个数据库之间并不是完全隔离的,比如FLUSHALL命令可以清空一个Redis实例中所有数据库中的数据。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
sudo apt-get update sudo apt-get install redis-server #安装redis redis-server #使用默认配置启动redis redis-server ../redis.conf #使用指定配置文件启动redis redis-cli #使用测试客户端程序redis-cli和redis服务交互 redis 127.0.0.1:6379> ping #使用ping进行测试,返回pong则说明redis正常运行 Redis桌面管理器 https://redisdesktop.com/download Redis 配置 你可以通过修改 redis.conf 文件或使用 CONFIG set 命令来修改配置。 参数说明详见 http://www.runoob.com/redis/redis-conf.html redis-cli 连接本地的 redis 服务 redis-cli -h host -p port -a password #连接远程 redis 服务 redis-cli -h 127.0.0.1 -p 6379 -a "mypass" redis-cli --raw #有时需要这个参数避免中文乱码 Redis 连接 AUTH password 验证密码是否正确(密码认证在连接reids成功后,在reids操作界面进行密码认证) ECHO message 打印字符串 PING 查看服务是否运行 QUIT 关闭当前连接 SELECT index 切换到指定的数据库
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
服务器命令 BGREWRITEAOF :异步执行一个 AOF(AppendOnly File) 文件重写操作 BGSAVE :在后台异步保存当前数据库的数据到磁盘 CLIENT KILL [ip:port] [ID client-id] :关闭客户端连接 CLIENT LIST :获取连接到服务器的客户端连接列表 CLIENT GETNAME :获取连接的名称 CLIENT PAUSE timeout :在指定时间内终止运行来自客户端的命令 CLIENT SETNAME connection-name :设置当前连接的名称 CLUSTER SLOTS :获取集群节点的映射数组 COMMAND :获取 Redis 命令详情数组 COMMAND COUNT :获取 Redis 命令总数 COMMAND GETKEYS :获取给定命令的所有键 TIME :返回当前服务器时间 COMMAND INFO command-name [command-name ...] :获取指定 Redis 命令描述的数组 CONFIG GET parameter :获取指定配置参数的值 CONFIG REWRITE :对启动 Redis 服务器时所指定的 redis.conf 配置文件进行改写 CONFIG SET parameter value :修改 redis 配置参数,无需重启 CONFIG RESETSTAT :重置 INFO 命令中的某些统计数据 DBSIZE :返回当前数据库的 key 的数量 DEBUG OBJECT key :获取 key 的调试信息 DEBUG SEGFAULT :让 Redis 服务崩溃 FLUSHALL :删除所有数据库的所有key FLUSHDB :删除当前数据库的所有key INFO [section] :获取 Redis 服务器的各种信息和统计数值 LASTSAVE :返回最近一次 Redis 成功将数据保存到磁盘上的时间,以 UNIX 时间戳格式表示 MONITOR :实时打印出 Redis 服务器接收到的命令,调试用 ROLE :返回主从实例所属的角色 SAVE :同步保存数据到硬盘 SHUTDOWN [NOSAVE] [SAVE] :异步保存数据到硬盘,并关闭服务器 SLAVEOF host port :将当前服务器转变为指定服务器的从属服务器(slave server) SLOWLOG subcommand [argument] :管理 redis 的慢日志 SYNC :用于复制功能(replication)的内部命令
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
如果是用apt-get或者yum install安装的redis,可以直接通过下面的命令停止/启动/重启redis /etc/init.d/redis-server stop /etc/init.d/redis-server start /etc/init.d/redis-server restart 如果是通过源码安装的redis,则可以通过redis的客户端程序redis-cli的shutdown命令来重启redis 1.redis关闭 redis-cli -h 127.0.0.1 -p 6379 shutdown 2.redis启动 redis-server 如果上述方式都没有成功停止redis,则可以使用终极武器 kill -9 加上‘&’号使redis以后台程序方式运行 ./redis-server &
Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
命令: DEL key:该命令用于在 key 存在时删除 key。 TYPE key :返回 key 所储存的值的类型。 EXISTS key:检查给定 key 是否存在。 RENAME key newkey :修改 key 的名称 RENAMENX key newkey :仅当 newkey 不存在时,将 key 改名为 newkey 。 EXPIRE key seconds:为给定 key 设置过期时间,以秒计。 EXPIREAT key timestamp :EXPIREAT 的作用和 EXPIRE 类似,都用于为 key 设置过期时间。 不同在于 EXPIREAT 命令接受的时间参数是 UNIX 时间戳(unix timestamp)。 PEXPIRE key milliseconds :设置 key 的过期时间以毫秒计。 PEXPIREAT key milliseconds-timestamp :设置 key 过期时间的时间戳(unix timestamp) 以毫秒计 KEYS pattern :查找所有符合给定模式( pattern)的 key 。 #keys * 查看所有的keys MOVE key db :将当前数据库的 key 移动到给定的数据库 db 当中。 PERSIST key :移除 key 的过期时间,key 将持久保持。 PTTL key :以毫秒为单位返回 key 的剩余的过期时间。 TTL key :以秒为单位,返回给定 key 的剩余生存时间(TTL, time to live)。 RANDOMKEY :从当前数据库中随机返回一个 key 。 DUMP key :序列化给定 key ,并返回被序列化的值。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
Redis 字符串(String)命令 Redis 字符串数据类型的相关命令用于管理 redis 字符串值 新增 SET key value:设置指定 key 的值 MSET key value [key value ...]:同时设置一个或多个 key-value 对。 SETNX key value:只有在 key 不存在时设置 key 的值。 MSETNX key value [key value ...] :同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在。 SETEX key seconds value:将值 value 关联到 key ,并将 key 的过期时间设为 seconds (以秒为单位)。 查看 GET key :获取指定 key 的值。 MGET key1 [key2..]:获取所有(一个或多个)给定 key 的值。 GETRANGE key start end:返回 key 中字符串值的子字符 GETSET key value:将给定 key 的值设为 value ,并返回 key 的旧值(old value)。 STRLEN key:返回 key 所储存的字符串值的长度。 修改 INCR key:将 key 中储存的数字值增一。 INCRBY key increment:将 key 所储存的值加上给定的增量值(increment) 。 INCRBYFLOAT key increment:将 key 所储存的值加上给定的浮点增量值(increment) 。 DECR key:将 key 中储存的数字值减一。 DECRBY key decrement:ey 所储存的值减去给定的减量值(decrement) 。 APPEND key value:如果 key 已经存在并且是一个字符串, APPEND 命令将指定的 value 追加到该 key 原来值(value)的末尾。 其他 GETBIT key offset:对 key 所储存的字符串值,获取指定偏移量上的位(bit)。 SETBIT key offset value:对 key 所储存的字符串值,设置或清除指定偏移量上的位(bit)。 SETRANGE key offset value:用 value 参数覆写给定 key 所储存的字符串值,从偏移量 offset 开始。 PSETEX key milliseconds value:这个命令和 SETEX 命令相似,但它以毫秒为单位设置 key 的生存时间,而不是像 SETEX 命令那样,以秒为单位。 以最小的空间记录所有的在线用户,且快速统计(快速有存疑) 每一个用户id对应了一组二进制字符串的一位bit; 当该位置为0时,表示用户不在线;当该位置为1时,表示用户在线 直接查询用户id对应的那一位bit值,即可知道用户是否在线 统计二进制字符串所有的1,即可知道在线用户数量 setbit login_users 1 0 #设置二进制字符串login_users的1位bit值为0 setbit login_users 2 1 #设置bit值为1 setbit login_users 3 0 bitcount login_users #统计该二进制字符串中1的数量,即在线用户总数 getbit login_users 5 #查看第5位的bit值,即是否在线
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
Redis 哈希(Hash)命令 Redis hash 是一个string类型的field和value的映射表,hash特别适合用于存储对象。 新增 HSET key field value :将哈希表 key 中的字段 field 的值设为 value 。 HMSET key field1 value1 [field2 value2 ] :同时将多个 field-value (域-值)对设置到哈希表 key 中。 HSETNX key field value :只有在字段 field 不存在时,设置哈希表字段的值。 查看 HEXISTS key field :查看哈希表 key 中,指定的字段是否存在。 HGET key field :获取存储在哈希表中指定字段的值。 HMGET key field1 [field2] :获取所有给定字段的值 HGETALL key :获取在哈希表中指定 key 的所有字段和值 HKEYS key :获取所有哈希表中的字段 HLEN key :获取哈希表中字段的数量 HVALS key :获取哈希表中所有值 HSCAN key cursor [MATCH pattern] [COUNT count] :迭代哈希表中的键值对。 修改 HINCRBY key field increment :为哈希表 key 中的指定字段的整数值加上增量 increment 。 HINCRBYFLOAT key field increment :为哈希表 key 中的指定字段的浮点数值加上增量 increment 。 删除 HDEL key field1 [field2] :删除一个或多个哈希表字段
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
Redis 列表(List)命令 Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边) 新增(插入) LINSERT key BEFORE|AFTER pivot value :在列表的元素前或者后插入元素 LPUSH key value1 [value2] :将一个或多个值插入到列表头部 LPUSHX key value :将一个值插入到已存在的列表头部 RPUSH key value1 [value2] :在列表中添加一个或多个值 RPUSHX key value :为已存在的列表添加值 查看 LINDEX key index :通过索引获取列表中的元素 LLEN key :获取列表长度 LRANGE key start stop :获取列表指定范围内的元素 修改(移除) BLPOP key1 [key2 ] timeout :移出并获取列表的第一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。 BRPOP key1 [key2 ] timeout :移出并获取列表的最后一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。 BRPOPLPUSH source destination timeout :从列表中弹出一个值,将弹出的元素插入到另外一个列表中并返回它; 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。 LPOP key :移出并获取列表的第一个元素 LSET key index value :通过索引设置列表元素的值 LREM key count value :移除列表元素 RPOP key :移除列表的最后一个元素,返回值为移除的元素。 RPOPLPUSH source destination :移除列表的最后一个元素,并将该元素添加到另一个列表并返回 LTRIM key start stop :对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
Redis 集合(Set)命令 Redis 的 Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。 Redis 中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。 新增 SADD key member1 [member2] :向集合添加一个或多个成员 查看 SCARD key :获取集合的成员数 SDIFF key1 [key2] :返回给定所有集合的差集 SMEMBERS key :返回集合中的所有成员 SRANDMEMBER key [count] :返回集合中一个或多个随机数 SSCAN key cursor [MATCH pattern] [COUNT count] :迭代集合中的元素 修改 SMOVE source destination member :将 member 元素从 source 集合移动到 destination 集合 删除 SPOP key :移除并返回集合中的一个随机元素 SREM key member1 [member2] :移除集合中一个或多个成员 集合间操作 SDIFFSTORE destination key1 [key2] :返回给定所有集合的差集并存储在 destination 中 SINTER key1 [key2] :返回给定所有集合的交集 SINTERSTORE destination key1 [key2] :返回给定所有集合的交集并存储在 destination 中 SISMEMBER key member :判断 member 元素是否是集合 key 的成员 SUNION key1 [key2] :返回所有给定集合的并集 SUNIONSTORE destination key1 [key2] :所有给定集合的并集存储在 destination 集合中
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
Redis 有序集合(sorted set)命令 Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。 不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。 有序集合的成员是唯一的,但分数(score)却可以重复。 集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。 新增 ZADD key score1 member1 [score2 member2] :向有序集合添加一个或多个成员,或者更新已存在成员的分数 查看 ZCARD key :获取有序集合的成员数 ZCOUNT key min max :计算在有序集合中指定区间分数的成员数 ZLEXCOUNT key min max :在有序集合中计算指定字典区间内成员数量 ZRANGE key start stop [WITHSCORES] :通过索引区间返回有序集合成指定区间内的成员 ZRANGEBYLEX key min max [LIMIT offset count] :通过字典区间返回有序集合的成员 ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT] :通过分数返回有序集合指定区间内的成员 ZRANK key member :返回有序集合中指定成员的索引 ZREVRANGE key start stop [WITHSCORES] :返回有序集中指定区间内的成员,通过索引,分数从高到底 ZREVRANGEBYSCORE key max min [WITHSCORES] :返回有序集中指定分数区间内的成员,分数从高到低排序 ZREVRANK key member :返回有序集合中指定成员的排名,有序集成员按分数值递减(从大到小)排序 ZSCORE key member :返回有序集中,成员的分数值 ZSCAN key cursor [MATCH pattern] [COUNT count] :迭代有序集合中的元素(包括元素成员和元素分值) 修改 ZINCRBY key increment member :有序集合中对指定成员的分数加上增量 increment 删除 ZREM key member [member ...] :移除有序集合中的一个或多个成员 ZREMRANGEBYLEX key min max :移除有序集合中给定的字典区间的所有成员 ZREMRANGEBYRANK key start stop :移除有序集合中给定的排名区间的所有成员 ZREMRANGEBYSCORE key min max :移除有序集合中给定的分数区间的所有成员 集合间操作 ZINTERSTORE destination numkeys key [key ...] :计算给定的一个或多个有序集的交集并将结果集存储在新的有序集合 key 中 ZUNIONSTORE destination numkeys key [key ...] :计算给定的一个或多个有序集的并集,并存储在新的 key 中
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
Redis HyperLogLog(一种新增的结构) Redis 在 2.8.9 版本添加了 HyperLogLog 结构。 详见http://www.runoob.com/redis/redis-tutorial.html
Redis 发布订阅
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。
Redis 客户端可以订阅任意数量的频道。
SUBSCRIBE channel [channel ...] :订阅给定的一个或多个频道的信息。
PSUBSCRIBE pattern [pattern ...] :订阅一个或多个符合给定模式的频道。
PUBSUB subcommand [argument [argument ...]] :查看订阅与发布系统状态。
PUBLISH channel message :将信息发送到指定的频道。
UNSUBSCRIBE [channel [channel ...]] :指退订给定的频道。
PUNSUBSCRIBE [pattern [pattern ...]] :退订所有给定模式的频道。
python操作Redis
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
import redis # Redis对象的方法与Redis中的命令基本一致, # 参数说明详见https://www.cnblogs.com/alex3714/articles/6217453.html r = redis.Redis(host='10.0.0.45', port=6379)#填上假地址,虚假连接会一直保持阻塞状态 r.set('foo', 'Bar') print(r.get("foo")) r.hset("dict1","name","allen") print(r.hget("dict1",'name')) r.lpush("list1",11,22,33) print(r.llen('list1')) # redis-py默认在执行每次请求都会创建(连接池申请连接)和断开(归还连接池)一次连接操作,如果想要在一次请求中指定多个命令,则可以使用pipline实现一次请求指定多个命令,并且默认情况下一次pipline 是原子性操作。 pipe = r.pipeline(transaction=True) pipe.set('name100', 'alex') pipe.set('role200', 'sb') pipe.execute()# 执行管道
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
import redis class RedisHelper: def __init__(self): self.__conn = redis.Redis(host='10.0.0.45',port=6379)#填上错误地址,虚假连接会一直保持阻塞状态 self.chan_sub = 'fm104.5' self.chan_pub = 'fm104.5' def public(self, msg): self.__conn.publish(self.chan_pub, msg) return True def subscribe(self): pub = self.__conn.pubsub() pub.subscribe(self.chan_sub) pub.parse_response() return pub # 订阅者 obj = RedisHelper() redis_sub = obj.subscribe() while True: msg= redis_sub.parse_response() print(msg) # 发布者 obj = RedisHelper() obj.public('hello') obj.public('hello2') obj.public('hello3')
参考文章:
https://www.cnblogs.com/alex3714/articles/6217453.html
http://www.runoob.com/redis/redis-tutorial.html
Redis 命令参考 http://doc.redisfans.com/