字符串
Redis字符串可以存储三种类型的值:字节串,整数,浮点数。
用户可以通过给定一个任意的数值,对存储着整数或者浮点数的字符串执行自增或者自减操作,有需要的时候,Redis还会将整数转换成浮点数。
Redis中的自增和自减命令
INCR: INCR key-name 将键存储的值加上1
DECR: DECR key-name 将键存储的值减去1
INCRBY : INCRBY key-name amount 将键存储的值加上整数amount
DECRBY : DECRBY key-name amount 将键存储的值减去整数amount
INCRBYFLOAT : INCRBYFLOAT key-name amount 将键存储的值加上浮点数amount (这个在redis2.6或者以上的版本可用)
java代码示例如下:
public class Chapter03 { public static void main(String[] args) { String key = "string-key"; Jedis jedis = new Jedis("localhost"); System.out.println(jedis.get(key)); System.out.println(jedis.incr(key)); System.out.println(jedis.incrBy(key, 15)); System.out.println(jedis.decrBy(key, 5)); System.out.println(jedis.get(key)); System.out.println(jedis.set(key, "13")); System.out.println(jedis.incr(key)); } }
Redis处理子串和二进制位的命令
APPEND: APPEND key-name value 将值value追加到给定键当前存储的值的末尾
GETRANGE: GETRANGE key-name start end 获取一个由偏移量start至偏移量end范围内所有字符组成的子串,包括start和end在内
SETRANGE: AETRANGE key-name offset value 将从start偏移量开始的子串设置为给定值
GETBIT : GETBIT key-name offset 将字节串看做是二进制位串,并返回位串中偏移量为offset的二进制位的值
SETBIT: SETBIT key-name offset value 将字节串看作是二进制位串,并将位串中偏移量为offset的二进制位的值设置为value
BITCOUNT : BITCOUNT key-name [start end] 统计二进制位串里面值为1的二进制位的数量,如果给定了可选的start偏移量和end偏移量,那么只对偏移量指定范围内的二进制位进行统计
BITOP : BITOP opration dest-key key-name [key-name ...] 对一个或者多个二进制位串执行包括并、或、异或、非在内的任意一种按位运算操作,并将计算得出的结果保存在dest-key键里面。
注意:
在使用setrange 或者 setbit命令对字符串进行写入时,如果字符串当前的长度不能满足写入的要求,那么Redis会自动使用空字节null将字符串扩展至所需的长度,然后执行写入或者更新操作。
在使用getrange读取字符串的时候,超出字符串末尾的二进制会被视为空串,使用getbit读取二进制位串的时候,超出字符串末尾的二进制会被视为0
java示例:
String key = "new-string-key"; Jedis jedis = new Jedis("localhost"); System.out.println(jedis.append(key, "hello ")); System.out.println(jedis.append(key, "world!")); System.out.println(jedis.substr(key, 3, 7)); System.out.println(jedis.setrange(key, 0, "H")); System.out.println(jedis.setrange(key, 6, "W")); System.out.println(jedis.get(key)); System.out.println(jedis.setrange(key, 11, ", how are you?")); System.out.println(jedis.get(key)); System.out.println(jedis.setbit("another-key", 2, "1")); System.out.println(jedis.setbit("another-key", 7, "1")); System.out.println(jedis.get("another-key"));
列表
一些常用的列表命令:
RPUSH : RPUSH key-name value [value ...] 将一个或者多个值推入列表的右端
LPUSH : LPUSH key-name value [value ...] 将一个或者多个值推入列表的左端
RPOP : RPOP key-name 移除并返回列表最右端的元素
LPOP : LPOP key-name 移除并返回列表最左端的元素
LINDEX : LINDEX key-name start end 返回列表从start偏移量到end偏移量范围内的所有元素,包括start和end元素在内
LTRIM : LTRIM key-name start end 对列表进行修剪,只保留start偏移量到end偏移量范围内的元素,包括start和end元素在内。
java代码示例:
String key = "list-key"; Jedis jedis = new Jedis("localhost"); System.out.println(jedis.rpush(key, "last")); System.out.println(jedis.lpush(key, "first")); System.out.println(jedis.rpush(key, "new last")); System.out.println(jedis.lrange(key, 0, -1)); System.out.println(jedis.lpop(key)); System.out.println(jedis.lpop(key)); System.out.println(jedis.lrange(key, 0, -1)); System.out.println(jedis.rpush(key, "a","b","c")); System.out.println(jedis.lrange(key, 0, -1)); System.out.println(jedis.ltrim(key, 2, -1)); System.out.println(jedis.lrange(key, 0, -1));
阻塞式的列表弹出命令以及在列表之间移动元素的命令
BLPOP : BLPOP key-name [key-name ...] timeout 从第一个非空队列中弹出位于最左端的元素或者在timeout秒之内阻塞并等待可弹出的元素出现
BRPOP : BRPOP key-name [key-name ...] timeout 从第一个非空队列中弹出位于最右端的元素或者在timeout秒之内阻塞并等待可弹出的元素出现
RPOPLPUSH : RPOPLPUSH source-key dest-key 从source-key列表中弹出位于最右端的元素,然后将这个元素推入dest-key列表的最左端,并向用户返回这个元素
BRPOPLPUSH: BRPOPLPUSH source-key dest-key timeout 从source-key列表中弹出位于最右端的元素,然后将这个元素推入dest-key列表的最左端,并向用户返回这个元素,如果source-key为空,那么在timeout秒之内阻塞并等待可以弹出的元素出现
对于阻塞弹出命令和弹出并推入命令,最常见的用例就是消息传递和任务队列。
java代码示例:
String key = "list"; Jedis jedis = new Jedis("localhost"); System.out.println(jedis.rpush(key, "item1")); System.out.println(jedis.rpush(key, "item2")); System.out.println(jedis.rpush("list2", "item3")); System.out.println(jedis.brpoplpush("list2", key, 1)); System.out.println(jedis.brpoplpush("list2", key, 1)); System.out.println(jedis.lrange(key, 0, -1)); System.out.println(jedis.brpoplpush(key, "list2", 1)); System.out.println(jedis.blpop(1, key,"list2")); System.out.println(jedis.blpop(1, key,"list2")); System.out.println(jedis.blpop(1, key,"list2")); System.out.println(jedis.blpop(1, key,"list2"));
集合
常用的集合命令
SADD : SADD key-name item [item ...] 将一个或多个元素添加到集合中,并返回被添加元素当中原本并不存在于集合里面的元素数量
SREM : SREM key-name item [item ...] 从集合里面移除一个或者多个元素,并返回被移除元素的数量
SISMEMBER : SISMEMBER key-name item 检查元素item是否存在于集合key-name里
SCARD : SCARD key-name 返回集合包含的元素的数量
SMEMBERS : SMEMBERS key-name 返回集合包含的所有元素
SRANDMEMBER:SRANDMEMBER key-name [count] 从集合中随机返回一个或者多个元素,当count为正数时,命令返回的随机元素不会重复,当count是负数时,命令返回的随机元素可能出现重复
SPOP : SPOP key-name 随机移除集合中的一个元素,并返回被移除的元素
SMOVE : SMOVE source-key dest-key item 如果集合source-key包含元素item,那么从集合source-key里面移除元素item,并将元素item添加到集合dest-key中,如果Item被移除成功,命令返回1.否则返回0..
java代码示例
String key = "set-key"; Jedis jedis = new Jedis("localhost"); System.out.println(jedis.sadd(key, "a","b","c")); System.out.println(jedis.srem(key, "c","d")); System.out.println(jedis.srem(key, "c","d")); System.out.println(jedis.scard(key)); System.out.println(jedis.smembers(key)); System.out.println(jedis.smove(key, "set-key2","a")); System.out.println(jedis.smove(key, "set-key2","c")); System.out.println(jedis.smembers("set-key2"));
用于组合和处理多个集合的Redis命令
SDIFF : SDIFF key-name [key-name ...] 返回存在于第一个集合、但是不存在其他集合的元素
SIDFFSTORE: SDIFFSTORE dist-key key-name [key-name ...] 将那些存在于第一个集合但是并不存在于其他集合中的元素存储到dest-key键里面
SINTER : SINTER key-name [key-name ...] 返回那些同时存在于所有集合中的元素
SINTERSTORE : SINTERSTORE dest-key key-name [key-name ...] 将那些同时存在于所有集合的元素存储到dest-key键里面
SUNION : SUNION key-name [key-name ...] 返回那些至少存在于一个集合中的元素
SUNIONSTORE : SUNIONSTORE dest-key key-name [key-name ...] 将那些至少存在于一个集合中的元素存储到dest-key键里面
java代码示例:
String key1 = "skey1"; String key2 = "skey2"; Jedis jedis = new Jedis("localhost"); System.out.println(jedis.sadd(key1, "a","b","c","d")); System.out.println(jedis.sadd(key2, "c","d","e","f")); System.out.println(jedis.sdiff(key1,key2)); System.out.println(jedis.sinter(key1, key2)); System.out.println(jedis.sunion(key1, key2));
散列
散列常用的操作命令
HMGET : HMGET key-name key [key ... ]从散列中获取一个或者多个键的值
HMSET : HMSET key-name key value [key value ...] 为散列里面的一个或多个键设置值
HDEL : HDEL key-name key [key ...] 删除散列里面的一个或者多个键值对,返回成功找到并删除的键值对数量
HLEN : HLEN key-name 返回散列包含的键值对数量
java代码示例:
String key = "hash-key"; Jedis jedis = new Jedis("localhost"); Map<String, String> map = new HashMap<String, String>(); map.put("k1", "v1"); map.put("k2", "v2"); map.put("k3", "v3"); System.out.println(jedis.hmset(key,map )); System.out.println(jedis.hmget(key, "k2","k3")); System.out.println(jedis.hlen(key)); System.out.println(jedis.hdel(key, "k1","k3"));
其他的散列命令
HEXISTS : HEXISTS key-name key 检查给定键是否存在于散列中
HKEYS : HKEYS key-name 获取散列包含的所有键
HVALS: HVALS key-name 获取散列包含的所有值
HGETALL : HGETALL key-name 获取散列包含的所有键值对
HINCRBY : HINCRBY key-name key increment 将键key存储的值加上整数 increment
HINCRBYFLOAT: HINCRBYFLOAT key-name key increment 将键key存储的值加上浮点数increment
java代码示例:
String key = "hash-key2"; Jedis jedis = new Jedis("localhost"); Map<String, String> map = new HashMap<String, String>(); map.put("short", "hello"); map.put("long", "1000"); System.out.println(jedis.hmset(key,map )); System.out.println(jedis.hkeys(key)); System.out.println(jedis.hexists(key, "num")); System.out.println(jedis.hincrBy(key, "num", 10)); System.out.println(jedis.hexists(key, "num"));
有序集合
常用的有序集合命令
ZADD : ZADD key-name score member [score member ...] 将带有给定分值的成员添加到有序集合里面
ZREM : ZREM key-name member[member ...] 从有序集合中移除给定的成员,并返回被移除成员的数量
ZCARD : ZCARD key-name 返回有序集合包含的成员数量
ZINCRBY : ZINCRBY key-name increment member 将member 成员的分值加上increment
ZCOUNT: ZCOUNT key-name min max 返回分值介于min 和max 之间的成员数量
ZRANK : ZRANK key-name member 返回成员member在有序集合中的排名
ZSCORE : ZSCORE key-name member 返回成员member的分值
ZRANGE : ZRANGE key-name start stop [withscores] 返回有序集合中排名介于start 和stop之间的成员,如果给定了可选的withsxores选项,那么命令会将成员的分支也一并返回
java代码示例:
String key = "zset-key"; Jedis jedis = new Jedis("39.105.6.169"); Map<String, Double> map = new HashMap<String, Double>(); map.put("a", 3D); map.put("b", 2D); map.put("c", 1D); System.out.println(jedis.zadd(key, map)); System.out.println(jedis.zcard(key)); System.out.println(jedis.zincrby(key, 3,"c")); System.out.println(jedis.zscore(key, "b")); System.out.println(jedis.zrank(key, "c")); System.out.println(jedis.zcount(key, 0, 3)); System.out.println(jedis.zrem(key, "b")); System.out.println(jedis.zrangeByScoreWithScores(key, 0, 4));
有序集合的范围型数据获取命令和范围型数据删除命令以及并集命令和交集命令
发布和订阅
发布与订阅的特点是订阅者listener负责订阅频道channel,发送者publisher负责向频道发送二进制字符串消息,每当有消息被发送给频道时,频道的所有订阅者都会收到消息。
发布和订阅的命令
SUBSCRIBE channel [ channel ... ] 订阅给定的一个或者多个频道
UNSUBSCRIBE [channel ] [channel ....] 退订给定的一个或者多个频道,如果执行时没有给定任何频道,那么退订所有频道。
PUBLISH channel message 向给定频道发送消息
PSUBSCRIBE pattern [pattern ...] 订阅与给定模式相匹配的所有频道
PUNSUBSCRIBE [pattern [pattern ...] ] 退订给定的模式,如果执行时没有给定任务合适,那么退订所有模式
简单的一个实现:
自定义一个订阅者,监听频道的内容并打印:
public class MyJedisPubSub extends JedisPubSub{ @Override public void onMessage(String s, String s1){ System.out.println("频道:"+s+"发送了消息:"+s1); } }
定义一个发布类,发送消息给频道
public class MyPublisher { public static void main(String[] args) { Jedis jedis = new Jedis("localhost"); jedis.publish("channel", "你好啊"); } }
测试类:
public class Chapter03 { static final String CHANNEL_NAME = "channel"; public static void main(String[] args) { Jedis jedis = new Jedis("localhost"); jedis.subscribe(new MyJedisPubSub(), CHANNEL_NAME); } }
基本的redis事务
Redis的事务要用到multi命令和exec命令,被multi命令和exec命令包围的所有命令会一个接着一个的执行,直到所有的命令都执行完毕。当一个事务执行完毕,Redis才会处理其他客户端的命令。
public class TranThread { public static void main(String[] args) throws InterruptedException { for(int i = 0; i<3 ; i++){ new Thread(new Runnable() { @Override public void run() { Transaction transaction = JedisUtil.getJedis().multi(); transaction.incr("trans"); transaction.incrBy("trans", -1); System.out.println(transaction.exec());; } }).start(); } Thread.sleep(10000); } }
键的过期时间
用于处理过期时间的命令
persist key-name 移除键的过期时间
ttl key-name 查看给定键距离过期还有多少秒
expire key-name seconds 让给定键在指定的秒数后过期
pttl key-name 查看给定键距离过期时间还有多少毫秒
expireat key-name timestamp 让指定键的过期时间设置为给定的unix时间戳
pexpire key-name milliseconds 让给定键在指定的毫秒数之后过期
pexpireat key-name timestamp-milliseconds 将一个毫秒级精度的UNIX时间戳设置给定键的过期时间
Jedis jedis =JedisUtil.getJedis(); jedis.set("key", "value"); System.out.println(jedis.get("key")); jedis.expire("key", 2); Thread.sleep(2000); System.out.println(jedis.get("key")); jedis.set("key", "value1"); jedis.expire("key", 100); System.out.println(jedis.ttl("key"));