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/