字符串
散列类型hash
列表list
集合set
有序集合
redis:缓存,队列系统,有TTL,到期自动删除;
HGET post:1 title
tar xzf *.gz
redis-check-aof AOF文件修复工具
redis-check-dump RDB文件检查工具
redis-sentinel Sentinel哨兵服务器
默认6379端口 redis-server --port 6379
配置文件:/etc/redis/6379.conf 数据文件: /var/redis/6379
参数:daemonize:守护进程 dir:数据目录路径
停止:redis-cli SHUTDOWN
CONFIG SET loglevel warning //在线设置;
select 1 //选择1号数据库
flushall 清空所有数据库中的数据;
glob风格:?匹配一个 *:0个和多个;[]匹配括号间任一个字符;[]区间 \ 转义;
set,type,lpush:向指定的列表类型增加一个元素,不存在则创建
incr num //给数字加1
所有命令都是atomic operation原子操作;
user:1:friends / post:id:title 对象类型:对象ID,对象属性命名一个键;多个键用.分隔;
users:count
apt-cache policy redis 查看即将安装的版本;
user:count //用每个对象类型的count的键来查看当前对象的数量;复数(加s)形式;
messagepack:类似于json的消息通讯
INCRby key 2 //一次增加2;步长为2;
dec key //减 decby key 2 //步为减2
INCRbyFLOAT key 1.2 //增加浮点数;
append key val //尾追
strlen key
Mget Mset 同时设置获取多个值;Mset key1 val1 key2 val2 //Mget key1 key2 key3
M只是针对对符串
位操作:getBit key offset //setBit key offset value // bitCount key start end
BitOp operation destkey key
位支持:AND OR XOR NOT
bitOp OR res key1 key2 //将key1,key2执行OR操作,结果存入res;
散列数据结构:hash: key只能是string;不嵌套;最大4G
散列的key一般用Id:2这样表示;开头代表数据结构:Hash以h开头;
Hset,Hget,hMset,hMget,HgetAll
hset id:1 key value // 键名为id:1 key为title,value为值类型;
哈希值:id:1 下面可以有多个值:
hgetall id:1 //查看id:1这个key下面所有的字段值;
hSetNX:字段不存在时操作set;存在do nothing;
hdel id:1 price //删字段
INCR ids:count //统计id:字段的个数加1;
hkeys id:1 //获取id:1这个key的字段key;
hvals id:1 //只要值;key: id:1
hlen id:1 //id:1 到底有多少个字段
hmget id:1 user name //获取id:1这个hash的user,name多个字段的值;
删除整个HASH: del id:1,单个key是hdel key
lpush,rpush:双向链表的左右增;lpush 4 5 6
lpop,rpop 出列
Llen id 获取列表长度;
lRange key start stop //返回id从0开始,到stop结束的值;出队入队,后进先出;最后push的索引为0;
lrem 删除前多个少值为value的元素,0则删除;
lrem id 0 9 // 删除值为9的元素;
lindex id 0 //获得索引为0的值;
lset id 1 7 //设置id为1的索引值为7; //相当于改变了值了;
通过lset设置评价: lset comment 1 "good"
lrange id 0 -1 //查看所有内容;
ltrim id 0 1
rtrim id 0 1 //左右删
linsert 向列表中插入元素;根据值来定的,跟一个after,before;
rpoplpush : 右出左进,从一个列表出来,另一个列表进,相当于用源列表给新列表赋值;
sadd id 1 2 3 4
srem id 1 2 3 4
增加删除元素
sMembers id //查看所有集合的元素;
sIsMember id 5 //5是不是集合id内;
sDiff id uid差集 //直接返回结果
sInter a b c 交集
sunion 并集
scard:card在高数中表示集合元素个数,s表示集合,合起来,统计集合的个数;
sInterStore:不返回结果,直接存入第一个参数
sUnionStore一样;
sRandMember id 2//获取一个元素随机值;后面的2指要2个数,2可省略;
spop id 出集合; 后面可以跟一个数量
有序集合,注意key必须是一个数值;整形,浮点都可以
zAdd id 1 tom 2 peter 3 join
zadd id 1 tomm
zadd id +inf a //给有序集合正无穷大值a;
zadd id -inf b //负无穷大
zscore key member 获取成员分数: zscore scoreboard tom
zrange key start stop 获取成员范围 0 -1 所有
zrange id 0 -1 withscores 带标号,所有了,先值后数
zrangebyscore id min max // zRangeByScore id 80 100 //界于80到100分的人数;
zRangeByScore id 80 (100 //不含100
ZrangeByScore id 60 +inf Limit 1 3 //从第二个人开始 大于60++的人;
ZRevRangeByScore id 100 0 Limit 0 3
Zincrby id -4 tom //给tom减4;
按点击量排序: ZrevRange pageView start end; 时间范围也适合这种场景
zCard id //数量
zCount id min max 指定范围的元素个数
zrem id member 删值
zRemRangeByRank id 0 2 //删0到2,
zRemRangeByScore id (4 5 删范围,不含4;
zRank,zRevRank
zRank id peter //获取排名
zInterStore :交集
事务:
multi开始;exec开始执行;
watch命令可以监控一个或多个键,一旦其中一个键被修改(删),之后的事务就不会执行;一直到exec执行;执行exec会取消所有监控,相反也可以使用unwatch命令取消监控;
Expire id:1 900 //id:1 900秒后过期;返回1成功;TTL查询,Pexpire为毫秒;watch不监时间
缓存需要的设置项:设置配置文件:maxmemory(字节)maxmemory-policy:
LRU:Least Recently Used;最近最少使用;
allkeys-random:随机;
noeviction:不删,只返回错误
volatile-lru:设置了过期时间的LRU删
allkeys-lru:所有按lru删,不管有没有设置TTL;
volatile-ttl:删离过期时间最近的一个键;
按使用,按时间;随机;
sort 排序命令;
sort seta alpha //字母序 alpha desc 字母序,DESC降序;LIMIT offset count;
sort tag:ruby:posts by post:*->time DESC
sort tag by id:* DESC
by 参考键;
sort的GET参数获取条目:
sort tag:ruby:posts By post:*->time DESC Get post:*->title; //返回title,按时间排序
可以跟多个GET,中间用空格隔开;
GET # 会返回元素本身的值;
STORE 存起来;
尽可能减少排序元素数量,尽量limit,可能能store将结果缓存;
blpop , brpop 一理有新任务,则通知:brpop key 0 //0为超时时间,0永远等下去,直到有生产者
可以阻塞多个,如果都没有,则阻塞;有一个有,则弹出;
BlPop id user 500 //id,user字段均等500秒,如果有则弹,没有就等500秒;
发布者和订阅者: subscribe id
publish id //
Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。有序集合的成员是唯一的,但分数(score)却可以重复。
redis 127.0.0.1:6379> ZADD w3ckey 1 redis
(integer) 1
redis 127.0.0.1:6379> ZADD w3ckey 2 mongodb
(integer) 1
redis 127.0.0.1:6379> ZADD w3ckey 3 mysql
(integer) 1
redis 127.0.0.1:6379> ZADD w3ckey 3 mysql
(integer) 0
redis 127.0.0.1:6379> ZADD w3ckey 4 mysql
(integer) 0
redis 127.0.0.1:6379> ZRANGE w3ckey 0 10 WITHSCORES
1) "redis"
2) "1"
3) "mongodb"
4) "2"
5) "mysql"
6) "4"
-----------------------
object encoding f;
---------------------------------------------
pip install redis
import redis
r = redis.StrictRedis(host="127.0.0",port=6379,db=0)
r.set('foo','bar')
r.get(''foo')
-*-----LUA语法:
LUA数据类型: nil, bool, string, number, table,function;
变量无须声明,默认为nil;
不能使用全局变量,local c =1 ; local a,b = 1,2
函数:
local sy_hi = function()
print 'hi'
end
注释:-- 多行注释: --[[ ]]
a = {1,2,3 }表的索引从1开始,这点和C不同
逻辑操作:and or not
for 条件 do end
for 变量=初值,终值,步长 do end //实际上和C比就是加了do;
for index ,value in pairs(people) do
print(index)
print(value)
end
LUA提供的迭代器pairs,用来遍历表;
redis支持两种方式的持久化,一种是RDB,根据指定的规则定时将内存中的数据存储,另一种是AOF方式;在每次执行命令后将命令本身记录下来;
快照:1.根据规则自动;2.用户执行save , bg save 命令;3;flushall命令;4:replication时
配置文件: save 900 1 //900秒内1次更新;则快照;
save,bgsave: 开始持久化,后台持久化;lastsave:最后一次持久化的时间;
flushall 清理所有数据;
redis默认会将快照文件存储在redis当前进程的工作目录中的dump.rdb文件中,可以通过配置dir和dbfilename两个参数分别指定快照文件的存储路径和文件名;
aof(append only file) : .conf appendonly yes 默认为no
开始aof持久化后每执行一条会改redis中的数据的命令,Redis就会将该命令写入硬盘的AOF文件;
配置刷新:appendfsync everysec //
slaveof --host --port
info [sec]
redis-server --port 6380 --slaveof 127.0.0.1 6379 //注意前后顺序,后面才是主服务器端口
daemonize yes; 后台运行-
连接不同端口的客户端: -p 6379
改从服务器 slave-read-only yes
可以直接用命令: slaveof 127.0.0.1 6379
slaveof no one 命令解除奴役
配置文件:min-slaves-to-write 3 只有当3个或以上从数据库连到主机时,才可写;
min-slaves-max-lag 表示允许从数据库最长失去连接的时间;
从数据库还可以允许从数据库
提升性能:主服务器禁用持久化,从数据库开启;让从数据库去备份;
从 从数据库中恢复 1.slaveof no one 将从数据库提升为主数据库,然后将主数据库变成从数据库;
删除配置文件中的save语句,就禁用了RDB快照;
repl-diskless-sync no // 无盘复制 默认关;直接通过网络发给从机;
增量复制设置积压:backlog:积压:repl-backlog-size; repl-backlog-ttl;
哨兵:监控redis系统的运行状态:
1.主从是否正常;2.主数据库出现故障自动将从数据库转为主数据库;
配置哨兵:
生成 sentinel.conf 文件:sentinel monitor mymaster 127.0.0.1 6379 1
mymaster为自定义名字,为要监探的主数据库的名字;最后的1表示最低通过票数;
执行 redis-sentinel ./*.conf 进程加配置文件;
哨兵:每1秒发送ping,2秒向主和从__sentinel__:hello频道发送自己的信息;
每10秒哨兵会向主数据库和从数据库发送INFO命令;
sentinel down-after-milliseconds othermaster 600 //每600毫秒发送一次ping命令;
sentinel down-after-milliseconds mymaster 60000 每1秒发送一次ping命令;
ping无响应,则视为主观下线,然后询问其他哨兵节点是否也认为该数据库主观下线,如果达到指定数量,达到一定数量,则视为客观下线;
subjectively down :主观下线;
objectively down: 客观下线;选举领头的哨兵节点对主从系统发起故障恢复;
上面配置的票数,即是多少个通过后,才认为是客观下线;
1.为每个节点(无论是主从)部署一个哨兵;
2.使每个哨兵与其对应的节点的网络环境相同或相近;
3.票数N/2+1; 大部分同意恢复
集群:cluster-enabled yes打开集群,至少需要3个主数据库才能正常运行;
然后官方有配置程序:redis-trib.rb (ruby gem)
cluster nodes
cluster meet ip port 手工加入集群节点;
cluster replicate命令复制每个主数据库来以从数据库形式运行;要么向集群申请分配slot来以主数据库的形式运行;
cluster addslots s1 s2 分配slot
cluster slots 查看slots
cluster setslot "slotNum" node "nodeid" //引号内为变量
cluster getKeysInSlot "slot" "returnCount" //手工获取
migrate 127.0.0.1 6380 abc 0 159999 replace // 目标节点 键名,数据库号码 超时时间
集群只能使用0号数据库,所以总为0,上面的把当前结点迁移到6380;
redis-cli -c -p 6380 提供了集群模式来支持自动重定向;
管理:
requirepass 密码 //设置密码
如果是复制,主数据库设置了密码,则从数据库要设置masterauth参数;
slowlog get 打印日志
monitor 所有cli命令都会打印出来;
srem: 集合的移除;sIsmember 查看元素是否存在;
smembers 显示集合元素
hdel 删除hash;
psubscribe 订阅与给定模式匹配的所有频道
punsubscribe 退订给定的模式
redis事务在python客户端上是pipeline(流水线)实现的,对连接对象调用pipline()方法将创建一个事务;
def trans():
pipline = conn.pipline() //启动事物
pipline.incr('trans')
time.sleep(.1)
pipline.incr('trans:',-1)
print(pipline.execute()[0]
threading.Thread(target=trans).start() //启动线程执行trans
----------
persiste : 查看键的过期时间;
持久化:1.快照 2.只追加文件(append-only file)AOF;
sync : 同步远程服务器开始复制,对方会执行bgsave持久化;
快照持久化只适用于那些即使丢失一部分数据也不会造成问题的应用程序;而不能接受这种数据损失的应用程序要用AOF持久化;
appendfsync no 不对AOF文件执行任何显式同步操作,而是由OS决定何时对AOF文件进行同步,
which redis-cli // 查看执行环境路径;
非阻塞IO:EPOLL:epoll_create:通知操作系统,要使用epoll,调用epoll_ctl把文件描述符FD和关注的事件传给类型给内核,之后调用epoll_wait;当FD被更新时,内核会向应用程序发送消息,我们唯一需要做的就是为我们所关注的事件创建事件回调函数;