redis

来源:互联网 发布:单片机vs1003做mp3 编辑:程序博客网 时间:2024/06/03 06:15


一:说明: 


(1)如果只是用缓存的话,memecache  最合适,但是要多用的话 redis/tair 最合适。
(2)书:《淘宝技术的这10年》
(3)《mysql高级部分》视频
(4)阿里:isearch
(5)分布式数据库 CAP 原理:关系数据库是acid ,(1)强一致性,(2)可用性 ,(3)分区容错性  只能三选二,不能同时满足。
   平常我们用的最多的也就是AP (可用性,和分区容错性)CA 如rdbms CP 如:redis,Hbase mongodb, 大多数网站淘宝,京东
   之类的都是AP 要保证可用性和分区容错性,比如:淘宝点赞人数,这个不重要,不必保证强一致性(--6 个视频) 为了解决
   强一致性 带来的问题,提出了base 理论,即:基本可用,软状态,和最终一致使(--6)


二:linux 上安装redis 
  1,下载: 切换到 opt 目录下,运行 # wget http://download.redis.io/releases/redis-3.0.4.tar.gz
  2, 解压: # tar -zxvf redis-3.0.4.tar.gz
  3, 安装: 如果linux 没有安装c++编译器的话要先安装 编译器(1)能上网:# yum install gcc-c++ 
  3,安装: 切换到redis 解压后目录  输入 # make     然后安装完成。(如果安装失败可以通过 # make distclean 命令清理后安装)
  4,输入 # make install 
  5,切换到 /usr/local/bin 下, 可以发现安装后的文件。
  6,根目录下创建一个 myredis 文件夹 把opt/redis 里的  redis.conf 文件拷贝一份到myredis中(--8)
  7,进入/usr/local/bin# redis-server /myredis/redis-conf 启动redis服务
  8, 可以运行 ps -ef|grep redis 查看一下redis 是否启动
  9,可以运行 redis-cli -p 6379 进入redis 命令提示,然后输入ping 命令 如果出现 PONG 表示启动成功。
  10,可以通过 shutdown -->exit  退出。


三: redis 启动后的一些知识:


   1,redis 默认有16个库,从0 开始。可以使用 select dbid 来切换 如: select 6  切换到6号库
   2,dbsize : 查看当前数据库key d 数量
   3,keys * : 列出当前库中所有key的
   4,flushdb 清除当前库,flushall 所有库都清空
   5, 


 四:redis 五大数据类型

  1,键 key


      (1)赋值: set k1 v1 (当key存在时会被覆盖)
      (2)exists k1 判断k1 是否存在,比如java中删除一个key的时候要先判断是否存在
      (3)move k1 1: 把 k1 移动到1 号库中 
      (4)expire k1 2 : 给 k1 设置 2 秒钟的过期时间
      (5)ttl k1 :  查看k1 还有多长时间过期 ,-1 表示永不过期,-2 表示已过期
      (6)type k1 : 查看 k1 是什么类型




  1,字符串 String
      (1)append k1 v1 : 末尾添加字符 和java 一样
      (2)strlen k1 : 返回字符的长度
      (3)incr  k1 : 把 k1 加1 (返回计算后的结果)(incrby k1 v1  把 k1 的值加 v1 ,下面的decr 也一样)
      (4)decr k1 : 把k1 值减1 
      (5)getrange k1 v1 v2: 相当于 java 中的substring v1 v2 表示起始,结束位置,v2 为-1 时 表示截取到末尾
      (6) setrange k1 index v1 : 相当于 从指定位置 index 开始 replace
      (7) setex k1 t1 v1 : 设置值的同时,给加上一个过期时间  t1 (setex 就是 set with expire)
      (8) setnx k1 v1 : 就是如果不存在 k1  就添加k1 和set 的区别是 set 会覆盖存在的key
      (9) mset k1 v1 k2 v2 : 一次设置多个值
      (10) mget k1 k2 k3 : 一次获取多个值
      (11)msetnx k1 v1 k2 v2 : 一次设置多个值如果这些key 不存在的话,注意,如果有存在的有不存在的,那么都不成功。
      




  1,列表 List


      (12)lpush list1 1 2 3 4 :  把 1 2 3 4 放入 集合 list 中  1 在最底层,4 在最高层(从左边开始,相当于进栈一样,先进入的在最底层)
      (13)lrang list1 0 -1 : 和 getrange 一样 只不过这个是取集合中的值的(相当于出栈一样,后进先出)
      (14)rpush list2 1 2 3 4 5: 相当于从右边开始进栈一样,5,在最底层,1 在最高层
      (15)lpop : 相当于出栈,取栈顶元素
      (16)rpop : 相当于取栈底元素。
      (17)lindex list01 3 : 相当于 java 中  list.get(3)
      (18)llen : 相当于 java 中 list.size()
      (19)lrem list1 2 3 : 从list 中删除 两个 3 元素。
      (20)ltrim list1 0 3 : 相当于 从 list 中取 索引为0 到3 这4 个元素(注意:是从栈顶开始计算的) 然后从新赋值给 
 list1(list1 中原先的值被覆盖)(也就是剩下的被删除)
      (21)rpoplpush list1 list2 : 从list1 中取出一个元素(rpop 表示从栈底取),压入list2 中(从栈顶压入)
      (22) lset list1 index zhangsan : 把list1 中索引为 index 的值 设置为 zhangsan
      (23) linsert  key before /after v1 v2 : 在集合key 中的 值 v1 之 前或之后插入v2(只在列表中第一次碰到值v1的时候插入)
      (24) 总结:list 如果是空 那么这个list 就会被删除,也就是空的list没有意义,对list的头尾操作效率较高,对中间操作效率较低。


  1,集合 Set

      (1)sadd set1 1 1 2 2 : 把值1 ,2 放入set 集合中,即使有重复,也只放入不重复的,和java 中的set 集合一样
      (2) smembers set1 : 查看 集合set1 中的所有元素
      (3) sismember set1 v1 : 判断集合中是否存在 v1
      (4) scard set1 : 判断集合中有多少个元素  相当于java 中的 set.size()
      (5) srem set1 v1 : 删除 set1 中的 元素 v1
      (6) srandmember set1 3 : 从 set1 中随机取出 3 个 值
      (7) spop set1 : 从set 中 随机出栈(注意出栈,从原集合中删掉了这个元素)
      (8) smove set1 set2 v1 : 把 set1 中的元素 v1 移动到 set2 中
      (9) sdiff set1 set2 : 列出 在set1 中,而不在set2 中的元素(差集)
      (10) sinter set1 set2 : 列出set1 和set2的交集
      (11) sunion set1 set2 : 列出 set1 和set2 并集


  1,哈希:Hash (相当于map 其中value 相当于一个map)


      (1) hset user name zhangsan : 给 key user 设置一个值 这个值是一个key-value 形式的(name-zhangsan)
      (2) hget user name : 取出 key (user) 中的 name 的值
      (3) hmset user name zhangsan age 20 score 100 :  一次给 key (user) 设置多个键值对
      (4) hmget user name age score : 一次取出key(user)中的多个 key 的值(不包括key )
      (5) hgetall user : 一次取出 user 中的 所有的键值对
      (6) hlen user : 判断 user 中 有几对 key-value
      (7) hexists user name : 判断key (uer)中是否存在 name这个key
      (8) hkeys user : 获取 user 中的 所有的key
      (9) hvals user : 获取 user 中所有的 values
      (10) hincrby user age 2 : 对 user 中 的age 字段 加 2
      (11) hincrybyfloat age 0.5 : 对user 中的age 字段加一个小数(注意这里的age必须是小数才能加一个小数)
      (12) hsetnx  user age 20 : 如果user 中的age字段不存在的话 就添加这个字段


  1,有序集合 Zset(Sorted set)

         和set的 区别是 set 格式是 set1 v1 v2 v3  zset 多了一个socre 字段 格式是 set1 socre1 v1 score2 v2 

      (1)zadd set1 60 zhangsan 70 lisi 80 wangwu : 往zset中添加元素。并带上分数


      (2) zrange set1 index1 index2 : 取出 set1 中index1 到index2 之间的值 (0 -1)表示所有,这个是只有值,
 没有分数  如果最后 加上 with scores 那么分数也能查出来
      (3) zrangebyscore set1 60 90 : 查出60 -90 之间的值,不带分数(要带分数的话可以在最末尾 加上 withscores)
 还可以在最后加上 limit 2 2  来分页,和mysql一样
      (4)zrem key1 v1 : 删除值为 v1 的元素
      (5)zcard key1 :  相当于java 中的set.size()
      (6)zcount key1 60 80 :  统计 60 分到80分的元素的个数
      (7)zrank key1 v1 : 拿到 v1 的下标:
      (8)zscore key1 v1 : 拿到v1的分数
      (9)zrevrank key1 v1 :逆序获取下标值。
      (10)zrevrange key1  index1 index2 : 逆序获取index1 到index2 之间的值

五: redis 配置文件 redis.conf
      (1)密码,默认是无密码  输入命令 config get requirepass 可以获取当前密码, 输入 config set 123456 设置密码
         设置密码之后要输入 auth 123456 这样的密码去"登陆"
         config get dir 可以查看启动redis的目录


六:redis 持久化 RDB (redis databae),AOF (append only file)


    1,RDB


      (1),rdb 的数据文件 是dump.rdb
      (2),当从数据文件中恢复的时候 配置文件中有个 dbfilename dump.rdb (默认)文件,指定从哪个文件中恢复。
           当执行 flushall 或者shutdown 的时候 就迅速刷新到 dump.rdb 中了。可能保存的是空文件
      (3),snapshot 下有个save 15 1 之类的,,15 分钟内改变1 次就刷入磁盘,,有时我们想立即刷入磁盘 可以在设置值之后 
           执行save命令如 #set k1 v1    #save  除了save 还有bgsave 区别是save 会阻塞,直到备份完成。lastsave 返回最后一次
  保存成功的时间


     2,AOF


      (1),aof 启用的话 要在配置文件中 设置,rdb 和aof 文件都共存的话 启动redis 优先读取 aof 文件如果aof 文件有错的
           话,启动是不成功的,这时会在aof 文件目录下 生成一个 redis-check-aof 文件,通过命令:# redis-check-aof --fix appendonly.aof
  可以修复这个文件,aof持久化到硬盘的话有三种策略 1,alaways,每个操作立即持久化,2,everysecond: 每秒钟一次,(会丢失1秒钟数据)
  3,no
      (2),aof的文件会越来越大,可以使用bgrewrieaof 命令来精简aof文件,只保留能恢复数据的最小指令集。


七:事物
    
    1,(1)通过 multi 开启事务,(2)输入语句(多条,一个失败全失败),(3)通过exec 执行事务,通过 discard 丢弃命令
        这多条语句执行的时候有些区别,假如 这些语句中有一个错误语句,比如错误的命令,的话,整个事务都失败,没有一条成功
假如有个语句 错误 列如:字符串+整形,的话 ,那么错误的这条失败,其他的都成功。


    2,watch 监控(悲观锁/乐观锁/CAS(check and set))
         
(1) 通过watch 监控某个key(就像事务中的版本号 一样,锁定当前key的版本号,当另外一个 事务 修改这个key的时候,版本号
      也会变,那么当前事务在提交的时候 由于版本号不一致,所以提交失败(返回 nil)) 事务语法: <1>watch k1 <2>multi 
      <3> 修改语句 <4> exec      如果 发现有其他事务修改 的话 可以先unwatch  然后再watch 另外 执行exec(提交)后 所有的
      watch 会被取消


八:消息发布和订阅


    1,通过 subscribe chanel1 chanel2 chanel3 可以一次订阅多个频道, 通过 publish chanel1 chanel2 向频道发送消息
       支持以通配符* 的形式订阅多个频道


     
九:主从复制


    1,先模拟多个机器 复制3 个redis.conf 分别配置 (1)开启 daemonize yes (2)指定端口 (3)修改log 文件名字,(4)
       修改 dump.rdb 文件名字


    2,通过命令 info replication 可以查看服务器信息,(是主还是备等)


    3,通过命令 slaveof 主机ip 主机端口 能链接到主机上,注意只有主机能写,从机是不能写的,会出错


    4,(1)如果主机死了的话,那么从机 仍然是slave (2)如果主机死了,然后又连回来了,那么 主机还是主机
        从机还是从机。(3)如果从机死了的话 那么就从主机断开了,即使从刑连上 也连不上主机了,从机自己变成了
主机。 (4)如果主机断了,从机没断,可以在两个从机中任选一个 执行 slaveof no one  使这个从机变成主机(这
需要手动操作,而使用哨兵模式的话,会自动选主机)


(5)哨兵模式:假如主机死了的话,从机 开始投票选出主机,先在 redis.conf 同级下建一个配置文件  sentinel.conf
文件 ,增加配置 sentinel monitor host6379 127.0.0.1 6379 1 ( host6379 表示的是主机的名字,任意取,地址,端口
表示的是主机的地址 端口,1 表示多少票,也就是主机死后,从机中谁先得到指定票数,谁充当主机) 然后启动哨兵 redis
安装目录下 #redis-sentinel sentinel.conf 然后  就会从两个从的中选一个当主机,这时候如果主机恢复了的话,那么
这个恢复的主机也会成为从机。
 
    5,主从有两种模式 (1)1:1:1 这种线性模式,第一从slaveof 住机ip port 第二从个slaveof 第一个从ip port
       (2)第二中模式是1:n  
原创粉丝点击