redis基本介绍--从菜鸟到熟悉||20170601redis管道命令介绍

来源:互联网 发布:淘宝px是什么意思 编辑:程序博客网 时间:2024/05/16 05:05
基本使用代码package com.eversec.test.redistest;import java.util.HashMap;import java.util.List;import java.util.Map;import java.util.Set;import redis.clients.jedis.Jedis;public class RedisStructureTest {public static void main(String[] args) {Jedis jedis = new Jedis("localhost");// Stringjedis.set("key", "Hello World!");String value = jedis.get("key");System.out.println(value);// ListSystem.out.println("==List==");jedis.rpush("messages", "Hello how are you?");jedis.rpush("messages", "Fine thanks. I'm having fun with redis.");jedis.rpush("messages", "I should look into this NOSQL thing ASAP");List<String> values = jedis.lrange("messages", 0, -1);System.out.println(values);// SetSystem.out.println("==Set==");jedis.sadd("myset", "1");jedis.sadd("myset", "2");jedis.sadd("myset", "3");jedis.sadd("myset", "4");Set<String> setValues = jedis.smembers("myset");System.out.println(setValues);// Sorted Setjedis.zadd("hackers", 1940, "Alan Kay");jedis.zadd("hackers", 1953, "Richard Stallman");jedis.zadd("hackers", 1965, "Yukihiro Matsumoto");jedis.zadd("hackers", 1916, "Claude Shannon");jedis.zadd("hackers", 1969, "Linus Torvalds");jedis.zadd("hackers", 1912, "Alan Turing");setValues = jedis.zrange("hackers", 0, -1);System.out.println(setValues);// HashSystem.out.println("==Hash==");Map<String, String> pairs = new HashMap<String, String>();pairs.put("name", "Akshi");pairs.put("age", "2");pairs.put("sex", "Female");jedis.hmset("kid", pairs);values = jedis.hmget("kid", new String[] { "name", "age", "sex" });System.out.println(values);setValues = jedis.hkeys("kid");System.out.println(setValues);values = jedis.hvals("kid");System.out.println(values);pairs = jedis.hgetAll("kid");System.out.println(pairs);jedis.close();}}

redis基本使用说明场景:参考http://www.jb51.net/article/54774.htm

http://www.cnblogs.com/lizhenghn/p/5322887.html

1. String——字符串

String 数据结构是简单的 key-value 类型,value 不仅可以是 String,也可以是数字、使用 Strings 类型,可以完全实现目前 Memcached 的功能,并且效率更高。还可以享受 Redis 的定时持久化(可以选择 RDB 模式或者 AOF 模式),操作日志及 Replication 等功能。

相关命令:

SET key value                   设置key=valueGET key                         或者键key对应的值GETRANGE key start end          得到字符串的子字符串存放在一个键GETSET key value                设置键的字符串值,并返回旧值GETBIT key offset               返回存储在键位值的字符串值的偏移MGET key1 [key2..]              得到所有的给定键的值SETBIT key offset value         设置或清除该位在存储在键的字符串值偏移SETEX key seconds value         键到期时设置值SETNX key value                 设置键的值,只有当该键不存在SETRANGE key offset value       覆盖字符串的一部分从指定键的偏移STRLEN key                      得到存储在键的值的长度MSET key value [key value...]   设置多个键和多个值MSETNX key value [key value...] 设置多个键多个值,只有在当没有按键的存在时PSETEX key milliseconds value   设置键的毫秒值和到期时间INCR key                        增加键的整数值一次【不存在先创建,初始化0】INCRBY key increment            由给定的数量递增键的整数值INCRBYFLOAT key increment       由给定的数量递增键的浮点值DECR key                        递减键一次的整数值DECRBY key decrement            由给定数目递减键的整数值【不存在先创建,初始化0】APPEND key value                追加值到一个键【而且采用智能分配内存(每次2倍)】管理命令DEL key                         如果存在删除键DUMP key                        返回存储在指定键的值的序列化版本EXISTS key                      此命令检查该键是否存在EXPIRE key seconds              指定键的过期时间EXPIREAT key timestamp          指定的键过期时间。在这里,时间是在Unix时间戳格式PEXPIRE key milliseconds        设置键以毫秒为单位到期PEXPIREAT key milliseconds-timestamp        设置键在Unix时间戳指定为毫秒到期KEYS pattern                    查找与指定模式匹配的所有键MOVE key db                     移动键到另一个数据库PERSIST key                     移除过期的键PTTL key                        以毫秒为单位获取剩余时间的到期键。TTL key                         获取键到期的剩余时间。RANDOMKEY                       从Redis返回随机键RENAME key newkey               更改键的名称RENAMENX key newkey             重命名键,如果新的键不存在TYPE key                        返回存储在键的数据类型的值。

使用示例:

redis 127.0.0.1:6379> set baidu http://www.baiduOKredis 127.0.0.1:6379> append baidu .com(integer) 20redis 127.0.0.1:6379> get baidu"http://www.baidu.com"redis 127.0.0.1:6379> set visitors 0OKredis 127.0.0.1:6379> incr visitors(integer) 1redis 127.0.0.1:6379> incr visitors(integer) 2redis 127.0.0.1:6379> get visitors"2"redis 127.0.0.1:6379> incrby visitors 100(integer) 102redis 127.0.0.1:6379> get visitors"102"redis 127.0.0.1:6379> type baidustringredis 127.0.0.1:6379> type visitorsstringredis 127.0.0.1:6379> ttl baidu(integer) -1redis 127.0.0.1:6379> rename baidu baidu-siteOKredis 127.0.0.1:6379> get baidu(nil)redis 127.0.0.1:6379> get baidu-site"http://www.baidu.com"

2. Hash——字典

在 Memcached 中,我们经常将一些结构化的信息打包成 hashmap,在客户端序列化后存储为一个字符串的值(一般是 JSON 格式),比如用户的昵称、年龄、性别、积分等。这时候在需要修改其中某一项时,通常需要将字符串(JSON)取出来,然后进行反序列化,修改某一项的值,再序列化成字符串(JSON)存储回去。简单修改一个属性就干这么多事情,消耗必定是很大的,也不适用于一些可能并发操作的场合(比如两个并发的操作都需要修改积分)。而 Redis 的 Hash 结构可以使你像在数据库中 Update 一个属性一样只修改某一项属性值。存储、读取、修改用户属性

Redis Hash对应Value内部实际就是一个HashMap,实际这里会有2种不同实现,这个Hash的成员比较少时Redis为了节省内存会采用类似一维数组的方式来紧凑存储,而不会采用真正的HashMap结构,对应的value redisObject的encoding为zipmap,当成员数量增大时会自动转成真正的HashMap,此时encoding为ht。

相关命令:

    HDEL key field[field...] 删除对象的一个或几个属性域,不存在的属性将被忽略    HEXISTS key field 查看对象是否存在该属性域    HGET key field 获取对象中该field属性域的值    HGETALL key 获取对象的所有属性域和值    HINCRBY key field value 将该对象中指定域的值增加给定的value,原子自增操作,只能是integer的属性值可以使用    HINCRBYFLOAT key field increment 将该对象中指定域的值增加给定的浮点数    HKEYS key 获取对象的所有属性字段    HVALS key 获取对象的所有属性值    HLEN key 获取对象的所有属性字段的总数    HMGET key field[field...] 获取对象的一个或多个指定字段的值    HSET key field value 设置对象指定字段的值    HMSET key field value [field value ...] 同时设置对象中一个或多个字段的值    HSETNX key field value 只在对象不存在指定的字段时才设置字段的值    HSTRLEN key field 返回对象指定field的value的字符串长度,如果该对象或者field不存在,返回0.    HSCAN key cursor [MATCH pattern] [COUNT count] 类似SCAN命令【每次返回少量的元素,不会像keys一样阻塞服务器】 

使用示例:

127.0.0.1:6379> hset person name jack(integer) 1127.0.0.1:6379> hset person age 20(integer) 1127.0.0.1:6379> hset person sex famale(integer) 1127.0.0.1:6379> hgetall person1) "name"2) "jack"3) "age"4) "20"5) "sex"6) "famale"127.0.0.1:6379> hkeys person1) "name"2) "age"3) "sex"127.0.0.1:6379> hvals person1) "jack"2) "20"3) "famale"

3. List——列表

List 说白了就是链表(redis 使用双端链表实现的 List),相信学过数据结构知识的人都应该能理解其结构。使用 List 结构,我们可以轻松地实现最新消息排行等功能(比如新浪微博的 TimeLine )。List 的另一个应用就是消息队列,可以利用 List 的 *PUSH 操作,将任务存在 List 中,然后工作线程再用 POP 操作将任务取出进行执行。Redis 还提供了操作 List 中某一段元素的 API,你可以直接查询,删除 List 中某一段的元素。

1.微博 TimeLine        2.消息队列

相关命令:

    BLPOP key1 [key2 ] timeout 取出并获取列表中的第一个元素,或阻塞,直到有可用    BRPOP key1 [key2 ] timeout 取出并获取列表中的最后一个元素,或阻塞,直到有可用    BRPOPLPUSH source destination timeout 从列表中弹出一个值,它推到另一个列表并返回它;或阻塞,直到有可用    LINDEX key index 从一个列表其索引获取对应的元素    LINSERT key BEFORE|AFTER pivot value 在列表中的其他元素之后或之前插入一个元素    LLEN key 获取列表的长度    LPOP key 获取并取出列表中的第一个元素    LPUSH key value1 [value2] 在前面加上一个或多个值的列表    LPUSHX key value 在前面加上一个值列表,仅当列表中存在    LRANGE key start stop 从一个列表获取各种元素    LREM key count value 从列表中删除元素    LSET key index value 在列表中的索引设置一个元素的值    LTRIM key start stop 修剪列表到指定的范围内    RPOP key 取出并获取列表中的最后一个元素    RPOPLPUSH source destination 删除最后一个元素的列表,将其附加到另一个列表并返回它    RPUSH key value1 [value2] 添加一个或多个值到列表    RPUSHX key value 添加一个值列表,仅当列表中存在

使用示例:

redis 127.0.0.1:6379> lpush list1 redis(integer) 1redis 127.0.0.1:6379> lpush list1 hello(integer) 2redis 127.0.0.1:6379> rpush list1 world(integer) 3redis 127.0.0.1:6379> llen list1(integer) 3redis 127.0.0.1:6379> lrange list1 0 31) "hello"2) "redis"3) "world"redis 127.0.0.1:6379> lpop list1"hello"redis 127.0.0.1:6379> rpop list1"world"redis 127.0.0.1:6379> lrange list1 0 31) "redis"

4. Set——集合

Set 就是一个集合,集合的概念就是一堆不重复值的组合。利用 Redis 提供的 Set 数据结构,可以存储一些集合性的数据。比如在微博应用中,可以将一个用户所有的关注人存在一个集合中,将其所有粉丝存在一个集合。因为 Redis 非常人性化的为集合提供了求交集、并集、差集等操作,那么就可以非常方便的实现如共同关注、共同喜好、二度好友等功能,对上面的所有集合操作,你还可以使用不同的命令选择将结果返回给客户端还是存集到一个新的集合中。

1.共同好友、二度好友

2.利用唯一性,可以统计访问网站的所有独立 IP

3.好友推荐的时候,根据 tag 求交集,大于某个 threshold 就可以推荐

相关命令:

    SADD key member [member ...] 添加一个或者多个元素到集合(set)里    SCARD key 获取集合里面的元素数量    SDIFF key [key ...] 获得队列不存在的元素    SDIFFSTORE destination key [key ...] 获得队列不存在的元素,并存储在一个关键的结果集    SINTER key [key ...] 获得两个集合的交集    SINTERSTORE destination key [key ...] 获得两个集合的交集,并存储在一个集合中    SISMEMBER key member 确定一个给定的值是一个集合的成员    SMEMBERS key 获取集合里面的所有value    SMOVE source destination member 移动集合里面的一个key到另一个集合    SPOP key [count] 获取并删除一个集合里面的元素    SRANDMEMBER key [count] 从集合里面随机获取一个元素    SREM key member [member ...] 从集合里删除一个或多个元素,不存在的元素会被忽略    SUNION key [key ...] 添加多个set元素    SUNIONSTORE destination key [key ...] 合并set元素,并将结果存入新的set里面    SSCAN key cursor [MATCH pattern] [COUNT count] 迭代set里面的元素

使用示例:

redis> SADD myset "Hello"(integer) 1redis> SADD myset "World"(integer) 1redis> SMEMBERS myset1) "World"2) "Hello"redis> SADD myset "one"(integer) 1redis> SISMEMBER myset "one"(integer) 1redis> SISMEMBER myset "two"(integer) 0
使用集合数据结构的典型用例是朋友名单的实现:

redis 127.0.0.1:6379> sadd friends:leto ghanima paul chani jessica(integer) 4redis 127.0.0.1:6379> sadd friends:duncan paul jessica alia(integer) 3redis 127.0.0.1:6379> sismember friends:leto jessica(integer) 1   #不管一个用户有多少个朋友,我们都能高效地(O(1)时间复杂度)识别出用户X是不是用户Y的朋友redis 127.0.0.1:6379> sismember friends:leto vladimir(integer) 0redis 127.0.0.1:6379> sinter friends:leto friends:duncan    #我们可以查看两个或更多的人是不是有共同的朋友1) "paul"2) "jessica"redis 127.0.0.1:6379> sinterstore friends:leto_duncan friends:leto friends:duncan # 可以在一个新的关键字里存储结果(integer) 2

5. Sorted Set——有序集合

Redis有序集合类似Redis集合,不同的是增加了一个功能,即集合是有序的。一个有序集合的每个成员带有分数,用于进行排序。

Redis有序集合添加、删除和测试的时间复杂度均为O(1)(固定时间,无论里面包含的元素集合的数量)。列表的最大长度为2^32- 1元素(4294967295,超过40亿每个元素的集合)。

Redis sorted set的内部使用HashMap和跳跃表(SkipList)来保证数据的存储和有序,HashMap里放的是成员到score的映射,而跳跃表里存放的是所有的成员,排序依据是HashMap里存的score,使用跳跃表的结构可以获得比较高的查找效率,并且在实现上比较简单。

使用场景:

Redis sorted set的使用场景与set类似,区别是set不是自动有序的,而sorted set可以通过用户额外提供一个优先级(score)的参数来为成员排序,并且是插入有序的,即自动排序。当你需要一个有序的并且不重复的集合列表,那么可以选择sorted set数据结构,比如twitter 的public timeline可以以发表时间作为score来存储,这样获取时就是自动按时间排好序的。

又比如用户的积分排行榜需求就可以通过有序集合实现。还有上面介绍的使用List实现轻量级的消息队列,其实也可以通过Sorted Set实现有优先级或按权重的队列。

和Sets相比,Sorted Sets是将 Set 中的元素增加了一个权重参数 score,使得集合中的元素能够按 score 进行有序排列,比如一个存储全班同学成绩的 Sorted Sets,其集合 value 可以是同学的学号,而 score 就可以是其考试得分,这样在数据插入集合的时候,就已经进行了天然的排序。另外还可以用 Sorted Sets 来做带权重的队列,比如普通消息的 score 为1,重要消息的 score 为2,然后工作线程可以选择按 score 的倒序来获取工作任务。让重要的任务优先执行。

1.带有权重的元素,比如一个游戏的用户得分排行榜

2.比较复杂的数据结构,一般用到的场景不算太多

相关命令:

    ZADD key score1 member1 [score2 member2] 添加一个或多个成员到有序集合,或者如果它已经存在更新其分数    ZCARD key 得到的有序集合成员的数量    ZCOUNT key min max 计算一个有序集合成员与给定值范围内的分数    ZINCRBY key increment member 在有序集合增加成员的分数    ZINTERSTORE destination numkeys key [key ...] 多重交叉排序集合,并存储生成一个新的键有序集合。    ZLEXCOUNT key min max 计算一个给定的字典范围之间的有序集合成员的数量    ZRANGE key start stop [WITHSCORES] 由索引返回一个成员范围的有序集合(从低到高)    ZRANGEBYLEX key min max [LIMIT offset count]返回一个成员范围的有序集合(由字典范围)    ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT] 返回有序集key中,所有 score 值介于 min 和 max 之间(包括等于 min 或 max )的成员,有序集成员按 score 值递增(从小到大)次序排列    ZRANK key member 确定成员的索引中有序集合    ZREM key member [member ...] 从有序集合中删除一个或多个成员,不存在的成员将被忽略    ZREMRANGEBYLEX key min max 删除所有成员在给定的字典范围之间的有序集合    ZREMRANGEBYRANK key start stop 在给定的索引之内删除所有成员的有序集合    ZREMRANGEBYSCORE key min max 在给定的分数之内删除所有成员的有序集合    ZREVRANGE key start stop [WITHSCORES] 返回一个成员范围的有序集合,通过索引,以分数排序,从高分到低分    ZREVRANGEBYSCORE key max min [WITHSCORES] 返回一个成员范围的有序集合,以socre排序从高到低    ZREVRANK key member 确定一个有序集合成员的索引,以分数排序,从高分到低分    ZSCORE key member 获取给定成员相关联的分数在一个有序集合    ZUNIONSTORE destination numkeys key [key ...] 添加多个集排序,所得排序集合存储在一个新的键    ZSCAN key cursor [MATCH pattern] [COUNT count] 增量迭代排序元素集和相关的分数
使用示例:

redis 127.0.0.1:6379> zadd dbs 100 redis(integer) 1redis 127.0.0.1:6379> zadd dbs 98 memcached(integer) 1redis 127.0.0.1:6379> zadd dbs 99 mongodb(integer) 1redis 127.0.0.1:6379> zadd dbs 99 leveldb(integer) 1redis 127.0.0.1:6379> zcard dbs(integer) 4redis 127.0.0.1:6379> zcount dbs 10 99(integer) 3redis 127.0.0.1:6379> zrank dbs leveldb(integer) 1redis 127.0.0.1:6379> zrank dbs other(nil)redis 127.0.0.1:6379> zrangebyscore dbs 98 1001) "memcached"2) "leveldb"3) "mongodb"4) "redis"

Reference

  • http://redis.io/commands
  • http://www.redis.cn/commands.html

二、redis 其他功能使用场景

1. 订阅-发布系统

Pub/Sub 从字面上理解就是发布(Publish)与订阅(Subscribe),在 Redis 中,你可以设定对某一个 key 值进行消息发布及消息订阅,当一个 key 值上进行了消息发布后,所有订阅它的客户端都会收到相应的消息。这一功能最明显的用法就是用作实时消息系统,比如普通的即时聊天,群聊等功能。

2. 事务——Transactions

谁说 NoSQL 都不支持事务,虽然 Redis 的 Transactions 提供的并不是严格的 ACID 的事务(比如一串用 EXEC 提交执行的命令,在执行中服务器宕机,那么会有一部分命令执行了,剩下的没执行),但是这个 Transactions 还是提供了基本的命令打包执行的功能(在服务器不出问题的情况下,可以保证一连串的命令是顺序在一起执行的,中间有会有其它客户端命令插进来执行)。Redis 还提供了一个 Watch 功能,你可以对一个 key 进行 Watch,然后再执行 Transactions,在这过程中,如果这个 Watched 的值进行了修改,那么这个 Transactions 会发现并拒绝执行。



redis管道命令reference:http://blog.csdn.net/freebird_lb/article/details/7778919

一个操作里面对redis有多个请求,多个请求每个都要等待响应这样最后的响应时间太长不可取,redis为我们提供了更便捷的方式。



0 0