🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
简介 \=========================== 1、redis是一个key-value存储系统。 2、和Memcached类似,它支持存储的value类型相对更多,包括**string**(字符串)、**hash**哈希、**list**(链表【栈、队列】)、**set**(集合)和**zset**(有序集合)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。 3、在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。 区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。 4、Redis 是一个高性能的key-value数据库。redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部 分场合可以对关系数据库起到很好的补充作用。它提供了Python,Ruby,Erlang,PHP客户端,使用很方便。 性能 \========================================================== **ACID**,指数据库事务正确执行的四个基本要素的缩写。包含:**原子性**(Atomicity)、**一致性**(Consistency)、**隔离性**(Isolation)、**持久性**(Durability)。 一个支持事务(Transaction)的数据库系统,必需要具有这四种特性,否则在事务过程(Transaction processing)当中无法保证数据的正确性,交易过程极可能达不到交易方的要求。  **事物处理** 整个事务中的所有操作,要么全部完成,要么全部不完成,不可能停滞在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。 一致性:在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。 隔离性:两个事务的执行是互不干扰的,一个事务不可能看到其他事务运行时,中间某一时刻的数据。 持久性:在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。 具体操作: \=================================== 1\. 安装redis 并布置环境(指定后台运行) \# tar -zxvf redis-2.4.17.tar.gz 解压 \# cd redis-2.4.17 进入目录 \# make 编译 \# make PREFIX=/usr/local/redis install 指定目录安装 \# cd /usr/local/redis/ 进入安装后的目录 \# mkdir etc logs 新建两个目录 \# cp /lamp/redis-2.4.17/redis.conf etc/ 复制配置文件 \# cd etc/ \# vi redis.conf 修改配置文件:开启后台运行、指定日志文件。 #./redis-server ../etc/redis.conf 启动 #netstat -tunpl |grep redis \# ./redis-server /usr/local/redis/etc/redis.conf 启动 \# ps -ef | grep redis 查看进程 \# netstat -tunpl | grep 6379 查看端口 \# ./redis-cli 客户端命令链接服务器 redis 127.0.0.1:6379> redis 127.0.0.1:6379>quit 退出 \# pkill redis-server 结束redis进程。 或: # ./redis-cli shutdown 执行关闭 **Redis****常用命令** \============================= 1\. 键值相关命令 \>keys \* //返回键(key) \>keys list\* //返回名以list开头的所有键(key) \>exists list1 //判断键名为list1的是否存在 存在返回1, 不存在返回0 \>del list1 //删除一个键(名为list1) \>expire list1 10 //设置键名为list1的过期时间为10秒之后 \>ttl list1 //查看键名为list1的过期时间,若为\-1表示以过期 \>move age 1 //将键名age的转移到1数据库中。 \>select 1 //表示进入到1数据库中,默认在0数据库 \>persist age //移除age的过期时间(设置为过期) Redis高级实用特性 \================================== 1\. 安全性:为Redis添加密码 \------------------------------- 1.进入配置文件: vi /usr/local/redis/etc/redis.conf 设置:requirepass redis的密码 2\. 重启服务: \# ./redis-cli shutdown 执行关闭 \# ./redis-server /usr/local/redis/etc/redis.conf 启动 3\. 登录(两种) \# ./redis-cli 客户端命令链接服务器 \>auth 密码值 //授权后方可使用 \# ./redis-cli -a 密码 //连接时指定密码来进行授权 2\. 主从复制 \------------------------------------------ 操作步骤: 1.先将linux虚拟机关闭,之后克隆一个。 2.启动两个虚拟机:master(主)和slave(从) 3\. 在slave(从)中配置一下ip地址 \# ifconfig eth0 192.168.128.229 \# ping 一下看看通不通。 4\. 配置从机 进入:配置文件 slaveof 192.168.128.228 6379 //配置连接主机的Redis的ip和端口 masterauth 密码 //配置连接密码 最后启动slave(从)机的Redis服务。 其他:可以通过info命令中的role属性查看自己角色是master、slave 3\. 事务处理 \-------------------------------------------- \>multi //开启一个事务 \>set age 10 //暂存指令队列 \>set age 20 \>exec //开始执行(提交事务) 或\>discard //清空指令队列(事务回滚) 4\. 乐观锁 \----------------------------------- 在事务前对被操作的属性做一个: \> watch age \>multi //开启一个事务(在此期间有其他修改,则此处会失败) \>set age 10 //暂存指令队列 \>set age 20 \>exec //开始执行(提交事务) 或\>discard //清空指令队列(事务回滚) 5\. 持久化机制(通过修改配置文件做设置) \----------------------------------- 1\. snapshotting(快照)默认方式 配置 save save 900 1 #900秒内如果超过1个key被修改,则发起快照保存 save 300 10 #300秒内容如超过10个key被修改,则发起快照保存 save 60 10000 2\. Append-only file(aof方式) 配置 appendonly on 改为yes 会在bin目录下产生一个.aof的文件 关于aof的配置 appendonly yes //启用aof 持久化方式 \# appendfsync always //收到写命令就立即写入磁盘,最慢,但是保证完全的持久化 appendfsync everysec //每秒钟写入磁盘一次,在性能和持久化方面做了很好的折中 \# appendfsync no //完全依赖os,性能最好,持久化没保证 6. 发布及订阅消息 \---------------------- 需要开启多个会话端口 会话1:\>subscribe tv1 //监听tv1频道 会话2:\>subscribe tv1 tv2 //监听tv1和tv2频道 会话3: >publish tv1 消息 //向tv1频道发送一个消息 7\. 使用虚拟内存 \------------------------------- 在redis配置文件中设置 vm-enabled yes #开启vm功能 vm-swap-file /tmp/redis.swap #交换出来的value保存的文件路径 vm-max-memory 1000000 #redis使用的最大内存上限 vm-page-size 32 #每个页面的大小32字节 vm-pages 134217728 #最多使用多少页面 vm-max-threads 4 #用于执行value对象换入患处的工作线程数量 flushdb:删除所有的数据 **5****种数据类型:** string(字符串)、hash(哈希表) list(双向链表)、set(集合)和zset(有序集合) **1\. String****(子串类型)** \-------------------------------------------- set 命令:设置一个键和值,键存在则只覆盖,返回ok \> set 键 值 例如: >set name zhangsan get 命令:获取一个键的值,返回值 \> get 键 例如:\>get name setnx命令:设置一个不存在的键和值(防止覆盖), \> setnx 键 值 若键已存在则返回0表示失败 setex命令:设置一个指定有效期的键和值(单位秒) \> setex 键 \[有效时间\] 值 例如: >setex color 10 red 不写有效时间则表示永久有效,等价于set setrange 键 位置 子字串 :替换子字符串 (替换长度由子子串长度决定) 位置 从0算起 \> setrange lichihua 4 aa 将name键对应值的第4个位置开始替换,返回lichaaua mset命令:批量设置键和值,成功则返回ok \> mset 键1 值1 键2 值2 键3 值3 .... msetnx命令:批量设置不存在的键和值,成功则返回ok \> msetnx 键1 值1 键2 值2 键3 值3 .... getset命令:获取原值,并设置新值 > getset 键 新值原值没有返回nil getrange key start end :获取指定范围的值 \>getrange 键 0 4 //获取指定0到4位置上的值 mget命令: 批量获取值 \>mget 键1 键2 键3.... incr命令: 指定键的值做加加操作,返回加后的结果。 整型(正整数或负整数)才能递增 > 键 \>incr kid incrby命令: 设置某个键加上指定值 \> incrby 键 m //其中m可以是正整数或负整数 \> incrby 3 在原来的基础上加3 decr 键: 指定键的值做减减操作,返回减后的结果。 例如: \>decr kid decrby命令: 设置某个键减上指定值 \> decrby 键 m //其中m可以是正整数或负整数 append命令:给指定key的字符串追加value,返回新字符串值的长度 \>append 键 追加字串 strlen 求长度\>strlen 键名 //返回对应的值。 **2\. hashes****类型** \------------------------------------------ hset(name, key, value)命令:设置一个哈希表的键和值   \>hset hash名 键 值 如:\>hset user:001 name zhangsan hget(name,key)命令: 获取执行哈希名中的键对应值 hsetnx(hashname, key, value)命令:设置一个哈希表中不存在的键和值   \>hsetnx hash名 键 值 //成功返回1,失败返回0 如:\>hsetnx user:001 name zhangsan hmset命令: hmset user:001 username zhangsan age 20 sex 1 批量设置 hmget: user:001 username age sex:批量获取值 \>hexists user:001 name //是否存在, 若存在返回1 \>hlen user:001 //获取某哈希user001名中键的数量 \>hdel user:001 name //删除哈希user:001 中name键 \>hkeys user:002 //返回哈希名为user:002中的所有键。 \>hvals user:002 //返回哈希名为user:002中的所有值。 \>hgetall user:002 //返回哈希名为user:002中的所有键和值。 hincrby(name, key, amount=1)自增name对应的hash中的指定key的值,不存在则创建key=amount hincrbyfloat(name, key, amount=1.0) 自增name对应的hash中的指定key的值,不存在则创建key=amount hscan(name, cursor=0, match=None, count=None) 增量式迭代获取,对于数据大的数据非常有用,hscan可以实现分片的获取数据,并非一次性将数据全部获取完,从而放置内存被撑爆 \# 参数: \# name,redis的name \# cursor,游标(基于游标分批取获取数据) \# match,匹配指定key,默认None 表示所有的key \# count,每次分片最少获取个数,默认None表示采用Redis的默认分片个数 \# 如: \# 第一次:cursor1, data1 = r.hscan('xx', cursor=0, match=None, count=None) \# 第二次:cursor2, data1 = r.hscan('xx', cursor=cursor1, match=None, count=None) \# ... \# 直到返回值cursor的值为0时,表示数据已经通过分片获取完毕 hscan\_iter(name, match=None, count=None) 利用yield封装hscan创建生成器,实现分批去redis中获取数据 \# 参数: \# match,匹配指定key,默认None 表示所有的key \# count,每次分片最少获取个数,默认None表示采用Redis的默认分片个数 \# 如: \# for item in r.hscan\_iter('xx'): # print item **3\. list****类型(双向链表结构)** \-------------------------------------------- list即可以作为“栈”也可以作为"队列"。 操作: lpush 键 值 向队列头部插入一个值 \>lpush list1 "world" //在list1头部压入一个字串 \>lpush list1 "hello" // 在list1头部压入一个字串 lrange 返回队列指定(索引)区间的值 \>lrange list1 0 -1 //获取list1中内容 返回队列指定区间的值 0:表示开头 \-1表示结尾。 rpush 向队列的尾部插入一个值 \>rpush list2 "world" //在list2尾部压入一个字串 \>rpush list2 "hello" // 在list2尾部压入一个字串 \>lrange list2 0 -1 //获取list2中内容 0:表示开头 \-1表示结尾。 linsert 在key对应的list的特定位置的钱或者后面添加字符串 \>linsert list2 before hello there //在list2的hello前加入there lset key index value 修改指定索引位置上的值 \>lset list2 1 "four" 修改指定索引位置上的值 lrem key cout value 移除队列值 \>lrem list2 2 "hello" //删除前两个hello值 \>lrem list2 -2 "hello" //删除后两个hello值 \>lrem list2 0 "hello" //删除所有hello值 ltrim key start stop 删除给定范围的值 \>ltrim mylist8 1 3 //删除此范围外的值 \>lpop list2 //从list2的头部删除元素,并返回删除元素 \>rpop list2 //从list2的尾部删除元素,并返回删除元素 \>rpoplpush list1 list2 //将list1的尾部一个元素移出到list2头部。并返回 \>lindex list2 1 //返回list2中索引位置上的元素 \>llen list2 //返回list2上长度 blpop key1 \[key2 \] timeout 移出并获取列表的第一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。> blpop list1 100        > blpop list1 list2 100    brpop key1 \[key2 \] timeout 移出并获取列表的最后一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。        > brpop list1 100        > brpop list1 list2 100    brpoplpush list1 another\_list timeout 从列表中弹出一个值,将弹出的元素插入到另外一个列表中并返回它; 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。 rpushx key\_name value1 \[..valuen\] 为依存在的队列(列表)尾部插入一个或者多个值 lpushx key\_name value1 \[..valuen\] 为依存在的队列(列表)头部插入一个或多个值 **4.****无序集合sets类型和操作** \------------------------------- \>sadd myset "hello" //向myset中添加一个元素 成功返回1,失败(重复)返回0 \>smembers myset //获取myset中的所有元素(结果是无序的) \>srem myset "one" //从myset中删除一个one 成功返回1,失败(不存在)返回0 \>spop myset //随机返回并删除myset中的一个元素 \>srandmember myset //随机获取myset中的一个元素,但是不删除 \> smove myset1 myset2 zhangsan:将myset1中zhangsan移动到myset2中 \> scard myset1 返回myset1的个数 \> sismember myset zhangsan:判断张三是否在myset中 \>sdiff myset1 myset2 //返回两个集合的差集以myset1为标准,获取myset2中不存在的。 \>sdiffstore dstset myset1 myset2 ...// 返回所有集合的差集,并保存到dstset中 \>sinter myset1 myset2 myset3... // 返回N个集合中的交集 \>sinterstore dstset myset1 myset2 ... // 返回N个集合的交集并存储到dstset中 \> sunion myset1 myset2 ...//返回所有集合的并集 \> sunionstore dstset myset1 myset2// 返回所有集合的并集,并存储到dstset中 sscan key index \[MATCH pattern\] \[COUNT count\] 迭代(遍历)集合中key的元值 \>sscan myset1 0 match h\* **5.****有序集合** \-----------------------------------------   zadd key\_name score1 value1.. scoren valuen   向有序集合添加一个或者多个成员,或者更新已存在成员的分数 score位排序! > zadd myzset 1 "one" 向myzset中添加one,排序为1排序     > zadd myzset 2 "two" 3 "three" zrem key member \[member ...\] 移除有序集合中的一个或多个成员     > zrem myzset one:删除zset中one zincrby key increment member 有序集合中对指定成员的分数加上增量 increment     > zincrby zset 2 one:如果one存在,则顺序增加2,如果one不存在,那么就是2 ??? zrank key member 返回有序集合中指定成员的索引     > zrank zset one:返回one在zset中排名(从小到大的排序) zrevrank key member 返回有序集合中指定成员的排名,有序集成员按分数值递减(从大到小)排序     > zrevrank zset one:返回one在zset中排名(从大到小的排序) zrange key start stop \[withscores\] 通过索引区间返回有序集合成指定区间内的成员     > zrange zset 0 -1 withscores:根据score排序(根据score从小到大排序) zrevrange key start stop \[withscores\] 返回有序集中指定区间内的成员,通过索引,分数从高到底     > zrevrange zset 0 -1 withscores:根据score排序(根据score从大到小排序) zrangebyscore key min max \[withscores\] \[limit offset count\] 通过分数返回有序集合指定区间内的成员     > zrangebyscore zset 2 3 withscores:返回集合中score在给定区间的元素(包含2和5) zcount key min max 计算在有序集合中指定区间分数的成员数     > zcount zset 2 3:返回集合中给定区间的数量 zcard key\_name 获取有序集合的成员数     > zcard zset:返回集合中元素的个数 zscore key member 返回有序集中,成员的分数值     > zscore zset one:返回one元素的score zremrangebyrank key start stop 移除有序集合中给定的排名区间的所有成员     > zremrangebyrank zset 3 3:删除集合中排名在给定区间的元素 zremrangebyscore key min max 移除有序集合中给定的分数区间的所有成员     > zremrangebyscore zset 1 2:将zset中从小到大排序结果的score在1-2之间的删除 zinterstore destination numkeys key \[key ...\] \[WEIGHTS weight \[weight ...\]\] \[AGGREGATE SUM|MIN|MAX\] 计算给定的一个或多个有序集的交集并将结果集存储在新的有序集合 key 中 其中给定 key 的数量必须以 numkeys 参数指定,并将该交集(结果集)储存到 destination 。默认情况下,结果集中某个成员的分数值是所有给定集下该成员分数值之和。 \# 有序集 mid\_test \> ZADD mid\_test 70 "Li Lei" (integer) 1 \> ZADD mid\_test 70 "Han Meimei" (integer) 1 \> ZADD mid\_test 99.5 "Tom" (integer) 1 \# 另一个有序集 fin\_test \> ZADD fin\_test 88 "Li Lei" (integer) 1 \> ZADD fin\_test 75 "Han Meimei" (integer) 1 \> ZADD fin\_test 99.5 "Tom" (integer) 1 \# 交集 \> ZINTERSTORE sum\_point 2 mid\_test fin\_test (integer) 3 \# 显示有序集内所有成员及其分数值 \> ZRANGE sum\_point 0 -1 WITHSCORES 1) "Han Meimei" 2) "145" 3) "Li Lei" 4) "158" 5) "Tom" 6) "199" zlexcount key min max 在有序集合中计算指定字典区间内成员数量 \> ZADD myzset 0 a 0 b 0 c 0 d 0 e \> ZADD myzset 0 f 0 g \> ZLEXCOUNT myzset - + (integer) 7 \> ZLEXCOUNT myzset \[b \[f (integer) 5 zrangebylex key min max \[limit offset count\] 通过字典区间返回有序集合的成员 \> zadd myzset 0 a 0 b 0 c 0 d 0 e 0 f 0 g \> zrangebylex myzset - \[c 1) "a" 2) "b" 3) "c" \> zrangebylex myzset \[aaa (g 1) "b" 2) "c" 3) "d" 4) "e" 5) "f" zremrangebylex key min max 移除有序集合中给定的字典区间(min和max之间)的所有成员 min个max以\[或者(开头 可以用\-表示最小值+表示最大值 min和max顺序不能相反 \> zadd zset 0 a 0 aa 0 abc 0 apple 0 b 0 c 0 d 0 d1 0 dd 0 dobble 0 z 0 z1 \> zremrangebylex zset \[d1 (dd 删除d1这个元素 \> zremrangebylex zset \[a \[apple \> zrange zset 0 -1 withscores \> zremrangebylex zset - + zrevrangebyscore key max min \[withscores\] \[limit offset count\] 返回有序集中指定分数区间内的成员,分数从高到低排序 \> ZADD salary 10086 jack \> ZADD salary 5000 tom \> ZADD salary 7500 peter \> ZADD salary 3500 joe \> ZREVRANGEBYSCORE salary +inf -inf \# 逆序排列所有成员 1) "jack" 2) "peter" 3) "tom" 4) "joe" \> ZREVRANGEBYSCORE salary 10000 2000 \# 逆序排列薪水介于 10000 和 2000 之间的成员 1) "peter" 2) "tom" 3) "joe" zunionstore destination numkeys key \[key ...\] \[WEIGHTS weight \[weight ...\]\] \[AGGREGATE SUM|MIN|MAX\] 计算给定的一个或多个有序集的并集,并存储在新的 key 中 其中给定 key 的数量必须以 numkeys 参数指定,并将该并集(结果集)储存到 destination,默认情况下,结果集中某个成员的分数值是所有给定集下该成员分数值之和 。 \> ZADD zset1 1 "one" \> ZADD zset1 2 "two" \> ZADD zset2 1 "one" \> ZADD zset2 2 "two" \> ZADD zset2 3 "three" \> zunionstore out 2 zset1 zset2 WEIGHTS 2 3 \> zrange out 0 -1 WITHSCORES 1) "one" 2) "5" 3) "three" 4) "9" 5) "two" 6) "10" zscan key cursor \[MATCH pattern\] \[COUNT count\] 迭代有序集合中的元素(包括元素成员和元素分值)