redis
redis安装
下载: wget http://download.redis.io/releases/redis-4.0.10.tar.gz 上传至/usr/local tar xzf redis-3.2.12.tar.gz 修改文件夹名称 mv redis-3.2.12 redis 安装 cd redis 启动src/redis-server
检查端口:
lsof -i:6379
说明启动成功
客户端连接测试:
src/redis-cli
配置sys-v
cp redis /etc/init.d/ chmod +x /etc/init.d/redis service redis status
基本文件配置:
安全配置:
在线变更配置:
redis持久化功能
RDB
RDB是基于快照的一种持久化功能,保存某个时间点的,key:value状态。 dbfilename dump.rdb dir /data/redis save 900 1 save 300 10 save 60 10000
优点:
快速持久化,
占用磁盘空间少,
一般备份是通过RDB实现的,
主从复制功能也是通RDB功能实现的。
缺点:
当断电,重启时,RDB会丢失少部分数据。
AOF
appendonly LogFile,追加模式的日志记录持久化方式。会记录redis中所有变更类的命令。
appendonly yes
appendfsync always
appendfsync everysec
优点:
相对RDB来讲,更加安全了。
缺点:
持久化速度相对较慢,需要更多的存储空间。
数据类型
string
hash
list
set
sorted set
key通用操作
KEYS * 查看KEY支持通配符
DEL 删除给定的一个或多个key
EXISTS 检查是否存在
RENAME 变更KEY名
TYPE 返回键所存储值的类型
EXPIRE\ PEXPIRE 以秒\毫秒设定生存时间
TTL\ PTTL 以秒\毫秒为单位返回生存时间
PERSIST 取消生存实现设置
STRING
计数器的实现: incr num 每次累计加1 decr num 每次累计减1 incrby num 10000 累计加10000 decrby num 10000 累计减10000
应用场景:
常规计数:微博数、粉丝数
普通的键值对的使用:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
127.0.0.1:6379> set name zhangsan OK 127.0.0.1:6379> 127.0.0.1:6379> 127.0.0.1:6379> get name "zhangsan" 127.0.0.1:6379> mset id 101 name zhangsan age 20 gender m OK 127.0.0.1:6379> keys * 1) "name" 2) "id" 3) "xyz" 4) "jishu" 5) "age" 6) "gender" 127.0.0.1:6379> mget id name age gender 1) "101"
string
增 set mykey "test" 为键设置新值,并覆盖原有值 getset mycounter 0 设置值,取值同时进行 setex mykey 10 "hello" 设置指定 Key 的过期时间为10秒,在存活时间可以获取value setnx mykey "hello" 若该键不存在,则为键设置新值 mset key3 "zyx" key4 "xyz" 批量设置键 删 del mykey 删除已有键 改 append mykey "hello" 若该键并不存在,返回当前 Value 的长度 该键已经存在,返回追加后 Value的长度 incr mykey 值增加1,若该key不存在,创建key,初始值设为0,增加后结果为1 decrby mykey 5 值减少5 setrange mykey 20 dd 把第21和22个字节,替换为dd, 超过value长度,自动补0 查 exists mykey 判断该键是否存在,存在返回 1,否则返回0 get mykey 获取Key对应的value strlen mykey 获取指定 Key 的字符长度 ttl mykey 查看一下指定 Key 的剩余存活时间(秒数) getrange mykey 1 20 获取第2到第20个字节,若20超过value长度,则截取第2个和后面所有的 mget key3 key4 批量获取键
Hash类型(字典)
增 hset myhash field1 "s" 若字段field1不存在,创建该键及与其关联的Hashes, Hashes中,key为field1 ,并设value为s ,若存在会覆盖原value hsetnx myhash field1 s 若字段field1不存在,创建该键及与其关联的Hashes, Hashes中,key为field1 ,并设value为s, 若字段field1存在,则无效 hmset myhash field1 "hello" field2 "world 一次性设置多个字段 删 hdel myhash field1 删除 myhash 键中字段名为 field1 的字段 del myhash 删除键 改 hincrby myhash field 1 给field的值加1 查 hget myhash field1 获取键值为 myhash,字段为 field1 的值 hlen myhash 获取myhash键的字段数量 hexists myhash field1 判断 myhash 键中是否存在字段名为 field1 的字段 hmget myhash field1 field2 field3 一次性获取多个字段 hgetall myhash 返回 myhash 键的所有字段及其值 hkeys myhash 获取myhash 键中所有字段的名字 hvals myhash 获取 myhash 键中所有字段的值
应用场景:
存储部分变更的数据,如用户信息等.
List列表
增 lpush mykey a b 若key不存在,创建该键及与其关联的List,依次插入a ,b, 若List类型的key存在,则插入value中 lpushx mykey2 e 若key不存在,此命令无效, 若key存在,则插入value中 linsert mykey before a a1 在 a 的前面插入新元素 a1 linsert mykey after e e2 在e 的后面插入新元素 e2 rpush mykey a b 在链表尾部先插入b,在插入a rpushx mykey e 若key存在,在尾部插入e, 若key不存在,则无效 rpoplpush mykey mykey2 将mykey的尾部元素弹出,再插入到mykey2 的头部(原子性的操作) 删 del mykey 删除已有键 lrem mykey 2 a 从头部开始找,按先后顺序,值为a的元素,删除数量为2个,若存在第3个,则不删除 ltrim mykey 0 2 从头开始,索引为0,1,2的3个元素,其余全部删除 改 lset mykey 1 e 从头开始, 将索引为1的元素值,设置为新值 e,若索引越界,则返回错误信息 rpoplpush mykey mykey 将 mykey 中的尾部元素移到其头部 查 lrange mykey 0 -1 取链表中的全部元素,其中0表示第一个元素,-1表示最后一个元素。 lrange mykey 0 2 从头开始,取索引为0,1,2的元素 lrange mykey 0 0 从头开始,取第一个元素,从第0个开始,到第0个结束 lpop mykey 获取头部元素,并且弹出头部元素,出栈 lindex mykey 6 从头开始,获取索引为6的元素 若下标越界,则返回nil
应用场景:
set集合
127.0.0.1:6379> sadd lxl jnl pg ms mr abc xyz baoqiang yf (integer) 8 127.0.0.1:6379> sadd jnl baoqiang yf xyz mr lxl (integer) 5 127.0.0.1:6379> SINTER lxl jnl 1) "mr" 2) "baoqiang" 3) "xyz" 4) "yf" 127.0.0.1:6379> SDIFF lxl jnl 1) "jnl" 2) "abc" 3) "ms" 4) "pg" 127.0.0.1:6379> SDIFF jnl lxl 1) "lxl" 127.0.0.1:6379> 127.0.0.1:6379> 127.0.0.1:6379> 127.0.0.1:6379> SUNION jnl lxl 1) "baoqiang" 2) "pg" 3) "xyz" 4) "yf" 5) "lxl" 6) "mr" 7) "jnl" 8) "ms" 9) "abc" 127.0.0.1:6379> SINTERSTORE gthy lxl jnl (integer) 4 127.0.0.1:6379> SMEMBERS gthy 1) "mr" 2) "baoqiang" 3) "yf" 4) "xyz" 127.0.0.1:6379>
应用场景:
有序集合
发布订阅: 窗口1: redis-cli -a 123 SUBSCRIBE fm1039 订阅单个频道 PSUBSCRIBE fm* 订阅多个频道 窗口2: 127.0.0.1:6379> PUBLISH fm1039 "hi!" (integer) 1 127.0.0.1:6379> PUBLISH fm1039 "hi!" (integer) 1 127.0.0.1:6379> PUBLISH fm1038 "hi!" (integer) 1 127.0.0.1:6379> PUBLISH fm1037 "hi!" (integer) 1 127.0.0.1:6379>
应用场景:
示例:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#创建连接池 import redis pool=redis.ConnectionPool(host="127.0.0.1",port=6379) r = redis.Redis(connection_pool=pool) ######String操作############# ''' #1、单个设置和批量设置 r.setnx('age',899) r.mset(k1='v1',k2='v2',k3="v3",k4="v4") #2、 单个获取和批量获取 print(r.mget("k1","k2","k3")) #3、子序列操作 print(r.getrange("alex",0,2)) ##b'sbs' r.setrange("alex",1,"xxx") #在第1个后面插入xxx 结果:"sxxx" #获取长度 print(r.strlen("alex")) #追加 r.append("alex","sb") print(r.get("alex")) ##b'sbsb' ''' ########Hash操作##################### """ ###单个设置 r.hset("info","sb","egon") #b'egon' ###批量设置 r.hmset("info",{"name":"alex","age":11,"gender":"male"}) print(r.hmget("info",{"name":"alex","age":11,"gender":"male"}))#[b'alex', b'11', b'male'] ###查看类型 print(type(r.hgetall("info"))) #<class 'dict'> ##统计长度 print(r.hlen("info")) ##只取keys print(r.hkeys("info")) #[b'name', b'sb', b'age', b'gender'] #分片取值 在数据量大的情况下使用最好 print(r.hscan_iter("info")) for i in r.hscan_iter("info"): print(i) (b'name', b'alex') (b'sb', b'egon') (b'age', b'11') (b'gender', b'male') """ ############# 链表操作 ######## # r.lpush("l1",11,22,33) # r.lpushx("l1",44) # print(r.llen("l1")) #7 # r.linsert("l1","BEFORE",22,55) # print(r.lindex("l1",1)) #按照索引取值 # print(r.lindex("l1",0)) # print(r.lindex("l1",1)) # print(r.lindex("l1",2)) # print(r.lindex("l1",3)) # print(r.lindex("l1",4)) # r.lpush("l2",11,22,33) # print(r.lrange("l2",0,-1)) #切片取值 # print(r.lrange("l1",0,-1)) #切片取值 # r.ltrim("l1",0,4) # print(r.lrange("l1",0,-1)) # print(r.exists("info"))