redis 学习
没有固定表结构 nosql的特点: 非关系型 分布式(做主从分离很简单) 开源的 水平可扩展 处理超大量数据 性能高 nosql适用场景 1、对数据高并发读写 2、海量数据高效率存储和访问 3、高可扩展和高可用 redis也支持事务,但过于简单 键值式存储,被称为数据结构服务器 支持:字符串 strings 哈希 hash 链表 list 模拟栈和队列 集合 set 有序集合 sorted set 这几种结构都支持 push/pop/add/remove取交集并集等 各种排序 可以周期性把数据写入磁盘或把修改操作写入追加的的记录文件(类似binlog) php 先从redis中读取,出错则从mysql中读取, redis和mysql中的数据保持同步 string类型: set name value #会被覆盖 永久有效 setnx name value #如果存在返回0,不会被覆盖,否则返回1, nx 是not exist的意思 setex name ttl value #设置有效期,可以覆盖重复的key set name song@126.com setrange name 6 gmail.com #从第六个字符开始替换(如果不如原字符串长,会保留原来的剩下的字符串部分) 返回值的总长度 get name #song@gmail.com #删除某个key del key #批量设置 如果ok都成功,如果0则都不成功 mset key1 value1 key2 value2 #批量设置,不覆盖已经存在的key,如果ok都成功,如果0则都不成功 #msetnx #设置一个值,并返回key的旧值 getset key value #获取指定key的指定位置字符 getrange key start(从0开始) end #批量获取 mget key1 key2 key3 #递增,并返回新值 key不存在则设置 incr key #增加指定值 key不存在则设置 incrby key num(可以是负数) decr 同上,递减 decrby 同上,递减指定值 #给指定key的字符串追加value,不存在则创建 append key value #返回值的长度 strlen key hash:是一个string类型的field和value的映射表 hset myhash key value #myhash可以看做一个表 hget hsetnx #同上 hmset hincrby #检测某个字段是否存在1 hexists myhash age #返回key的数量 hlen myhash user:1 #删除某个key hdel #返回哈希表所有的字段 hkeys myhash #返回哈希表所有的值 #获取某个哈希中所有的key、val hgetall list:链表 key 理解为链表的名字 每个元素都是string类型的 双向链表 可以作为栈和队列 #从头部压入一个元素 返回list中的元素个数 lpush #从第一个取到倒数第一个 lrange 0 -1 #从尾部压入一个元素 rpush #linsert 在特定位置的前或者后添加字符串 linsert mylist before "one" two #在one前面(上面为链表头,下面为链表尾)添加two元素 #替换指定下标的值 lset index value #从0开始数 #从key对应list中删除n个和value相同的值(n<0从尾部,n=0全部删除) lrem mylist n value #保留指定key范围内的数据 ltrim mylist 1 -1 #从list头部删除一个元素 lpop #从尾弹出 rpop #从第一个list的尾部移除元素并添加到第二个list的头部 rpoplpush mylist1 mylist2 #返回index位置的元素的值 lindex mylist index #返回链表的元素个数 llen #删除指定下标 index 的值,没有原生的方法 lset mylist index "del" lrem mylist 0 "del" set:集合string类型的无序集合 set是通过hash table实现的 添加、删除、修改的复杂度都是O(1),可以取交集、并集、差集 #添加一个元素 sadd myset value #列出所有元素 smembers myset #删除一个元素 srem myset value #随机弹出一个元素 spop myset #两个集合的差集 sdiff myset1 myset2 #将myset1、myset2的差集存到myset3里 sdiffstore myset1 myset2 myset3 #取交集 sinter sinterstore 同上 #并集 sunion sunionstore #将一个集合中的元素减去后放到另一集合中 smove myset1 myset2 value #把value从myset1 中移除,并添加到myset2中 #统计集合的元素个数 scard myset #测试某个元素是否属于这个集合 sismember myset value #随机返回一个元素,不删除元素 srandmember myset sorted sets :有序集合 set的一个升级版本在set的基础上添加了一个顺序属性 #添加一个元素 zadd myset index value #需要指定index顺序值 #显示数据 zrange myset 0 -1 withscores #删除 zrem myzset value #对顺序号进行增加,返回新的顺序号 zincrby myzset 1 one #显示值的索引值,注意并不是score值,先按score进行排序 zrank myzset value #先按score从大到小排序 zrevrank 同上 #以score值来取值 zrangebyscroe myzset from to #返回给定score区间的数量 zcounts myzset from to #所有元素个数 zcard myzset #按下标进行删除 zrembyrank #按score进行删除 zrembyscore #显示所有的key keys * #检测某个key是否存在 exists key #删除一个键 del key #设置某个键的过期时间 -1代表已经过期 expire key ttl 数据库编码 0-15 ,默认进入0数据库 select 0 #将当前数据库中的key,移动到其他库中 move key 1[数据库编号] #让某个key不在过期 persist key #随机返回key中的一个key randomkey #重命名一个key rename old new #返回key的类型 type key #测试连接是否联通 ping #输出一些信息 echo #当前数据库的key的数据 dbsize #redis服务器的一些信息 info #获取配置信息 config get * config get timeout #具体的条目 #清空当前数据库 flushdb #删除所有数据 flushall #设置密码 requirepass password #验证密码 登陆成功后 auth password redis-cli -a password #开启主从复制 只需在slave配置文件中加入 slaveof 192.168.0.1 6379 #指定master的ip、端口 masterauth lamp #指定主机密码 #事务 multi ..... discard #取消队列中的命令 exec #乐观锁 类似版本控制 #数据持久化 1、snapshotting(快照) 也是默认方式 #讲数据存到文件里 save 900 10 #900秒内如果有10个key被更改则保存快照 ,可以设置多个 如果中间宕机,会丢失最后一个的快照修改,且同步有延时 2、append-only-file (缩写aof)的方式 #将写改操作放到文件里,当redis重启时会通过执行文件中的内容重建整个数据库内容 由于os会在内核中缓存write的修改,所以有可能也不是立即写到磁盘上,这样还是会丢失数据 appendonly yes #使用aof持久化方式 appendfsync always #收到命令就立即写入磁盘,最慢,但是保证完全的持久化 appendfsync everysec #每秒写入一次 在性能和持久化方面做了很好的折中 appendfsync no #完全依赖os,性能最好,但持久化没保证 #订阅、发布 #订阅消息 subscribe tv1 tv2 #发布消息 publish tv1 "content" 更详细的命令请搜索 redis chm