Redis学习笔记

1、redis是?一个非关系型的key-value数据库
2、jedis是redis的一个连接器,java可以使用jedis连接redis。
2.1、jedis直接连接redis
  使用时导入jedis包。
  使用jedis类的构造器构造jedis对象并直接连接:Jedis jedis = Jedis(host,port);
  设置value使用,jedis.set(name,value);
  获取value使用:jedis.get(name);
  释放资源:jedis.close();
2.2、jedispool连接redis
  首先配置JedisPoolConfig:JedisPoolConfig  config  = new JedisPoolConfig();
  对JedisPoolConfig进行设置:config.setMaxTotal();//最大连接数
                          config.setMaxIdel();//最大空闲连接数:最多可以存在的空闲连接,多余的会被释放。
  获得连接池:JedisPool pool = new JedisPool(JedisPoolConfig,host,port);
  获得Jedis对象:Jedis jedis = pool.getResource();
  设置value使用,jedis.set(name,value);
  获取value使用:jedis.get(name);
  释放资源:jedis.close();
3、Redis的数据结构。
3.1、有哪些?
  [字符串String]、字符串列表list、有序字符串集合sorted set、[哈希hash]、无序字符串集合set。[常用]
3.2、NAME的定义
  NAME的长度不要过长,不能超过1024,消耗内存。
  不要过短,降低NAME的可用性。
3.3、String
  以二进制方式操作,存入和读取的数据是相同的。长度最大可以达到512M。
  command:赋值:set NAME VALUE
              获取:get NAME
              先获取再设置该NAME的值:getset NAME VALUE
              删除:del NAME
              增加:incr NAME   --将NAME的VALUE加一不能加一(value不能转为整型)的返回错误,如果NAME不存在,将VALUE设置为0,再加一
              减少:decr NAME   --将NAME的VALUE减一不能减一(value不能转为整型)的返回错误,如果NAME不存在,将VALUE设置为0,再减一
              增加:incrby NAME num --将NAME的VALUE加num不能加num(value不能转为整型)的返回错误,如果NAME不存在,将VALUE设置为0,再加num
              减少:decrby NAME num --将NAME的VALUE减num不能减num(value不能转为整型)的返回错误,如果NAME不存在,将VALUE设置为0,再减num
              拼接字符串:append NAME STRING  --将STRING拼接到NAME后 返回stringlength
3.4 Hash
  String KEY 和String Value的map容器
  每一个Hash可以存储4294967295个键值对
  command:赋值:hset HASH KEY VALUE              --将键值对KEY-VALUE设值到HASH中
              多组赋值:hmset HASH KEY1 VALUE2 KEY2 VALUE2   --将键值对KEY1-VALUE1 KEY2-VALUE2设值到HASH中
              取值:hget HASH KEY                --获取HASH的KEY的VALUE
              多组取值:hmget HASH KEY1 KEY2       --获取HASH的KEY1和KEY2的VALUE
              全部取值:hgetall HASH                 --获取HASH的所有值
              删除KEY:hdel HASH KEY
              删除多组KEY:hmdel HASH KEY1 KEY2
              删除哈希:del HASH                     --删除哈希
              增加数字:hincrby HASH KEY num      --将HASH中KEY的VALUE加num不能加num(value不能转为整型)的返回错误,如果HASH不存在,返回错误。如果KEY不存在,将VALUE设置为0,再加num
              判断是否存在:hexist HASH KEY              --判断HASH中的KEY是否存在,是返回1,否返回0
              判断hash的长度(属性数目):hlen HASH
              获取所有的KEY:hkey HASH
3.5、list
  按照插入顺序排序的字符串列表。如果list中所有元素被移除了,list也被删除。向一个list插入元素,如果list不存在,将会创建list。
  从前或者后端插入元素的效率很高,如果从中间插入,效率极低。
  list有ArrayList(数组)的方式存放数据(查询速度快,插入速度慢)。linkedlist(双向链表)的方式存放数据(插入删除速度快,查询速度慢)。
  command:两端添加:左侧添加:lpush LIST VALUE1 VALUE2 VALUE3  --将VALUE1 VALUE2 VALUE3放入LIST中,从左侧添加。
                         右侧添加:rpush LIST VALUE1 VALUE2 VALUE3  --将VALUE1 VALUE2 VALUE3放入LIST中,从右侧添加。
              查看列表:左侧查看:lrange LIST num1 num2   --查询LIST中下标num1到num2的值如lrange list 0 -1 :遍历list
              两端弹出:左端弹出:lpop
                         右侧弹出:rpop
              列表长度:llen
              插入仅当LIST存在时:lpushx LIST VALUE...
              从头删除count个num:lrem LIST count num         --count大于0时,从头删除count个num,count小于0时,从右删除-count个num,当count为0时,删除LIST中所有num
              设置:lset LIST num VALUE                                         --设置LIST中num位置的值为VALUE
              插入:linsert LIST before/after VALUE1 VALUE2         --在LIST的VALUE1 前/后 插入VALUE2
              组合命令?
              rpoplpush:rpoplpush LIST1 LIST2 获取LIST1右侧的一个值赋在LIST2左侧
    使用场景:消息队列
3.6、set
    基本同list但set集合不允许出现重复的元素同c++ Set
    每一个Set可以存储4294967295个元素。
    command:添加:sadd SET V1 V2 V3
               删除:srem SET V1
               查看:smembers SET                    --查看所有
               判断是否在set中:sismember SET VALUE      --查看VALUE是否在SET中,成功返回1,
               判断不同:sdiff SET1 SET2                  --返回SET1中与SET2第一个不同的VALUE
               交集运算:sinter SET1 SET2                           --返回SET1和SET2的交集
               并集运算:sunion SET1 SET2                   --返回SET1和SET2的并集
               获取数量:scard SET
               随机获得一个元素:srandmember SET
               判断不同并存到新set:sdiffstore NEWSET SET1 SET2        --比较SET1和SET2不同,赋值给新set
               获得交集并存到新set:sinterstore NEWSET SET1 SET2
               获得并集并存到新set:sunionstore NEWSET SET1 SET2
    使用场景:跟踪保存具有唯一性的数据,如url/用户ID。用于维护对象间的关系
3.7、sorted set
    与set的区别,每一个sorted set的元素都有一个分数与之关联,sorted set使用该分数对元素进行排序。成员时唯一的但分数可以重复。
    使用场景:游戏排名,微博话题
    command:添加:zadd SORT NUM VALUE ...                 --重复添加VALUE会将前一个覆盖。sorted set 会自动排序
               获得分数:zscore SORT VALUE
               获得数量:zcard SORT
               删除元素:zrem SORT VALUE ...                      --可删除多个
               查询元素:zrange SORT num1 num2                        --遍历 :zrange SORT0 -1
               查询元素:zrange SORT 0 -1    withscore                  --遍历并打印出分数
               反序查询元素:zrevrange
               按照排名的序号删除元素:zremrangebyrank SORT NUM1 NUM2
               按照分数的范围删除元素:zremrangerbyscore SORT score1 score2
               zrangebyscore limit
               zincrby
               zcount
    使用场景:积分排行榜

4、Redis的发布订阅者模式

  Redis可以使用基于发布订阅的消息通信模式执行数据分发,即客户端可以作为发布者、订阅者参与通信。

4.1、command  

  • PSUBSCRIBE    基于模式订阅一个或多个通道:通道匹配给定正则表达式的模式
  • PUBLISH            向通道发布消息
  • PUBSUB           
    • PUBSUB CHANNELS [pattern]                                 查询当前活跃的通道
    • PUBSUB NUMSUB [channel-1 ... channel-N]           返回给定频道的订阅者数量, 订阅模式的客户端不计算在内
    • PUBSUB NUMPAT                                                   返回基于模式订阅的模式的数量
  • PUNSUBSCRIBE    解除基于模式的订阅
  • SUBSCRIBE     基于通道订阅一个或多个通道
  • UNSUBSCRIBE      解除基于通道的订阅

5、Redis事务

  事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。事务是一个原子操作:事务中的命令要么全部被执行,要么全部都不执行,但是不支持callback回滚。

  事务的特点是:原子化、序列化、顺序化。

5.1、command

  MULTI 、 EXEC 、 DISCARD 和 WATCH 。

  multi:开启一个事务块。

  exec:结束事务块命令集合的键入并执行。

  discard:中止事务。

  watch:监听一个或多个key,该key当另外的客户端改变时,中止当前事务。使用乐观锁:将监听的key在其他客户端的改变看作偶然事件,降低同步的性能消耗。

Redis命令参考:http://doc.redisfans.com/

原文地址:https://www.cnblogs.com/xiangleili/p/8709572.html