[读书笔记]-技术学习-Redis

1:Redis概览
  1. Remote Dictionary Server 远程字典服务
  2. Redis是基于内存的存储
    1. 在一台普通的笔记本上,Redis每秒的读取速度可以达到10万
    2. 内存读取数据,断电的时候数据会丢失,但是Redis支持异步持久化到硬盘
  3. 多功能
    1. 数据库开发
    2. 缓存开发
    3. 队列开发
    4. 发布/订阅模式,可构建聊天室系统
  4. 键生存时间
    1. 每个键都可以设置生存时间,时间到后自动删除
  5. 与memcached的对比
    1. Redis是单线程,Memcached是多线程,所以多核服务器Mem的性能更高
    2. Redis的性能已经足够优秀了,所以大部门情况下Redis的性能并不会成为瓶颈
    3. 如果需要用到高级数据类型和持久化,Redis会是更好的选择
  6. 项目是开源的,3万多行代码,100名贡献者
  7. 安装与命令
    1. redis-cli  redis command line interface
    2. 命令回复
      1. 状态回复 PONG
      2. 错误回复 ERROR
      3. 整数回复 1
      4. 字符串回复 "1"
      5. 空回复 nil
      6. 多行字符串回复  "foo" "bar"
  8. 字典实例
    1. Redis默认支持16个字典实例
    2. Select 1选择1号数据库字典, 默认是0号
    3. FLUSHALL会清空所有 字典里面的数据,彼此并不隔离
    4. 不支持自定义名字
  9. 大小
    1. Redis非常轻量级,一个空的Redis实例只占有1M的大小
  10. 键命名:
    1. 对象类型:对象ID:对象属性
    2. 键的命名一定要有意义,如u:1:f的可读性显然不如user:1:friends好

2:Redis常用命令

  1. Keys * 显示所有的键,不建议在生产环境使用
  2. Exists,判断一个键是否存在。
    1. 返回1 表示存在
    2. 返回2 表示不存在
  3. Del  k1 k2 k3 ....kn
    1. 返回 1/2/3../n 表示成功删除的键的个数
  4. Keys  */k1 获取键
  5. Type  k1/k2... 获取键的类型
  6. Set/Lpush/
3:Redis数据类型
  1. 字符型
    1. 键允许的最大容量为512M
    2. 是其他四中类型的基础
    3. 命令
      1. set
      2. get
      3. incr、decr 递增 递减
        1. 如果是string会报错, 比如incr s1(s1 的值是a)
        2. 所有redis命令都是原子操作,不会出现并发的问题
      4. incrby、decrby  i 5  把i增加/减少 5
      5. incrbyfloat i 2.5 通过float类型添加
      6. append  key value 向key的末尾
      7. Mset k1 v1 k2 v2
      8. Mget k1 k2 k3
      9. GetBit/SetBit key offset 0/1 设置key值offset位置的bit为0或者1
      10. BitCount k  start  end
      11. BitOp   ex: bitop or result foo1 foo2
        1. And 并且
        2. Or 或者
        3. XOR 异或
        4. Not 非
        5. 利用位操作命令可以非常紧凑地存储布尔值。比如某网站的每个用户都有一个递增的整
          数ID,如果使用一个字符串类型键配合位操作来记录每个用户的性别(用户ID作为索引,
          二进
          制位值1和0表示男性和女性),那么记录100万个用户的性别只需占用100 KB多的空间,而且
          由于GETBIT和SETBIT的时间复杂度都是0(1),所以读取二进制位值性能很高。
      12. GetSet, set一个新值给key,返回旧值
                            你的系统每当有新用户访问时就用INCR命令操作一个Redis key。你希望每小时对这    
                            个信息收集一次。你就可以GETSET这个key并给其赋值0并读取原值。
    2.   散列型
  1. 最多可以容纳2^32个键
  2. 命令
    1. Hset key field value
    2. Hget key field
    3. Hmset key field1 value1 field2 values
    4. Hmget key field1 field2
    5. Hexists key field1 查看key 中 field1是否存在
    6. Hsetnx  key filednotexist value
    7. HIncrby key filed 20 将key中 field的值增加20
    8. Hdel key field field2 批量删除 key中的域
    9. Hkeys key 获取key中所有的field
    10. Hvals key 获取key中所有的值
    11. Hlen key 获取key中 field的个数
    3.   列表型
  1. 概览
    1. 列表内部是使用双向链表实现的,所以越靠近两端的元素速度越快
    2. 最多可以容纳2^32-1个键
  2. 命令
    1. Lpush listkey 1 2 3 4
    2. Rlush listkey 5 6 ,结果是  4 3 2 1 5 6
    3. Lpop  listkey
    4. Rpop listkey
    5. Llen listkey 返回键的元素数量,不存在返回0
    6. Lrange  listkey start end 返回 start 到 end之间的元素
      1. Lrange listkey 0 lenth 从左边开始获取所有
      2. Lrange listkey -length -1 从右边开始获取所有
    7. Lrem listkey count value 
      1. count >0 从左边开始,删除count个键值等于value的键
      2. count <0 从右边开始,删除count个键值等于value的键
    8. Lindex listkey 0 获取左边第一个, Lindex listkey -1 获取右边第一个
    9. Ltrim listkey start end 类似 lrange
    10. Linsert listkey After/Before findValue insertValue 在listkey中查找值等于findValue的元素,然后根据After/Before在后面插入数据
    11. RpopLpush source destination 很方便的传递数据,从一个列表的队尾传递到另一个列表的队首。
  3. 应用场景,较少访问中间元素的应用场景
    1. 新鲜事
    2. 日志
    4.    集合型
    1. 概览
      1. 一个集合类
      2. 最多可以容纳2^32-1个键
    2. 命令
      1. Sadd key a b c 批量添加元素
      2. Srem key a d 删除 a,d没有找到
      3. Smembers key
      4. Sismember key a 判断a是否存在在key中
      5. Sdiff key1 key2  表示所有属于key1但是不属于key2的元素
      6. Sinter key1 key2 取交集
      7. Sunion key1 key2 取并集
      8. Scard key1 获取key中元素个数
      9. Sdiffstore destiontion key1 key2
      10. Sintertore destiontion key1 key2
      11. Sunionstore destiontion key1 key2
      12. Srandmember key 随机获取key中的元素
    3. 实践
      1. 存储文章标签
      2. 127.0.0.1:6379> sadd post:1:tags java
(integer) 1
127.0.0.1:6379> sadd post:2:tags java redis
(integer) 2
127.0.0.1:6379> sadd post:3:tags java redis mysql
(integer) 3
127.0.0.1:6379> sadd tags:redis:post 3
(integer) 1
127.0.0.1:6379> sadd tags:mysql:post 2 3
(integer) 2
127.0.0.1:6379> sadd tags:java:post 1 2 3
(integer) 3
127.0.0.1:6379> sinter tags:redis:post tags:mysql:post tags:java:post 
1) "3"
127.0.0.1:6379> 
sinterstore tags_inter tags:redis:post tags:mysql:post tags:java:post
        5:有序集合
                    1:概览
                            1:每个值都关联了一个分数
                            2:有序的,可以获取分数最高最低的值,或者某一个范围的值
                            3:虽然集合中每个元素都是不同的,但是他们的分数确是可以相同
                            4:类似列表
                                    1:有序的
                                    2:可以获取某个范围的值
                            5:基于散列表和跳跃表,即时读取中间位置速度也很快,O(log(N))
                    2:命令
                            1:Zadd key score member [score member...]
                            2:Zrange(从小到大)、Zrevrange(从大到小) key 0 -1(表示结尾) 
                            3:Zrangebyscore key 80 100 取出key中80-100以内的的值                                                
                                  zrangebyscore scoreboard 20 100 limit 1 3  从index=1 开始取3个值
                            4:zrevrangebyscore 倒转查询 limit
                            5:zincrby
                            6:zscore  key value 获取key中值为value的分数
                            7:zcard key 返回key中值的个数
                            8:zcount key 80 100 统计分数在80 -100 之间的个数
                            9:zrem key  member 删除key中的member
                            10:zremrangebyrank  key start stop 
                                   zremrangebyrank testRem 0 2
                            11:Zrank 、Zrevrank  key member 获取key中member值的元素的排名
                            12:zinterstore destiontion zset1 zset2
 

4:Redis重要特性

       1:发布/订阅机制  pub/sub
                  当一个key值被更新之后,所以订阅他的客户端都会收到相应的消息
       2:事务
                1:Multi
                          do something
                    Exec
                2:错误情况
                            1:语法错误,没执行exec的时候就报错了
                            2:运行时错误,例如用集合操作去操作散列表,这个要等到exec之后错误才会显示出来
                                  并且错误语句之后的命令照样会执行
                    
 
 
    
 
 
 
    
原文地址:https://www.cnblogs.com/chnan/p/5324573.html