Redis--基本命令及Java操作

  本篇博文主要讲解,Redis的基本使用基本命令数据类型以及通过java操作Redis数据库(Jredis)。内容命令过多,不会一一演示,建议读者联想记忆。如果还没有搭建好环境请参考上篇博文:http://blog.xiaoxiaomo.com/2016/02/23/Linux-软件安装之Redis/

redis基础命令

  1. 获得符合规则的键名称
    keys 表达式(?,* ,[],\?)

  2. 判断一个键是否存在
    exists key

  3. 删除键
    del key
    del key1 key2

  4. 获得键值的数据类型type
    返回值可能是这五种类型(string,hash,list,set,zset)

注意:redis的命令不区分大小写

  • 实例代码:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    127.0.0.1:6379> exists blog
    (integer) 1
    127.0.0.1:6379> exists blogs
    (integer) 0
    127.0.0.1:6379> set blogs momo
    OK
    127.0.0.1:6379> keys *
    1) "blogs"
    2) "blog"
    127.0.0.1:6379> del blogs
    (integer) 1
    127.0.0.1:6379> keys *
    1) "blog"

redis的help命令

  • help command
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    127.0.0.1:6379> help
    redis-cli 3.0.6
    Type: "help @<group>" to get a list of commands in <group>
    "help <command>" for help on <command>
    "help <tab>" to get a list of possible help topics
    "quit" to exit
    127.0.0.1:6379> help del

    DEL key [key ...]
    summary: Delete a key
    since: 1.0.0
    group: generic

数据类型

string

字符串类型是redis中最基本的数据类型,它能存储任何形式的内容,包含二进制数据,甚至是一张图片(二进制内容)。在实际生产环境中我们存放json字符串比较常用一个字符串类型的值存储的最大容量是1GB

  • 命令
    1
    2
    3
    4
    5
    set/get(setnx)
    mset/mget ##返回/设置(一个或多个)给定 key 的值。
    incr/decr/incrby/decrby/incrbyfloat
    append ##append key value,将 value 追加到 key 原来的值的末尾,如果 key 不存在,key 设为 value
    strlen ##字符串长度

hash

hash类型的值存储了字段和字段值的映射,字段和字段值只能是字符串不支持其他数据类型。hash类型的键至多可以存储 (2的32次方-1)个字段。hash类型适合存储对象,redis可以为任何键增减字段而不影响其他键。

  • 命令

    1
    2
    3
    4
    5
    6
    hset/hget/hmset/hmget/hgetall(hsetnx)
    hexists ##判断键中的属性是否存在
    hincrby ##为哈希表 key 中的域 field 的值加上增量
    hdel ##删除
    hkeys/hvals ##返回哈希表 key 中的所有键/值
    hlen ##返回哈希表 key 中域的数量
  • 实例代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    redis> HGET counter page_view
    "200"

    redis> HINCRBY counter page_view -50
    (integer) 150

    redis> HGET counter page_view
    "150"


    # 尝试对字符串值的域执行HINCRBY命令

    redis> HSET myhash string hello,world # 设定一个字符串值
    (integer) 1

    redis> HGET myhash string
    "hello,world"

    redis> HINCRBY myhash string 1 # 命令执行失败,错误。
    (error) ERR hash value is not an integer

    redis> HGET myhash string # 原值不变
    "hello,world"

list

list是一个有序的字符串列表,列表内部实现是使用双向链表(linked list)实现的。list还可以作为队列使用,一个列表类型的键最多能容纳(2的32次方-1)个元素。

  • 命令
    1
    2
    3
    4
    5
    6
    lpush/rpush/lpop/rpop
    llen/lrange(-1表示最后一个元素的位置)
    lindex(查询指定角标数据)
    lset(修改)
    ltrim(截取,保留指定数据)
    rpoplpush:将元素从一个列表转到另一个列表

set

set集合中的元素都是不重复的,无序的,一个集合类型键可以存储至多(2的32次方-1)个元素 set集合类型和list列表类型的相似之处。

  • 命令

    1
    2
    3
    4
    5
    sadd/smembers/srem/sismember
    sdiff/sinter(交集)/sunion(并集)
    sdiffstore/sinterstore/sunionstore
    scard(获取集合长度)/spop(随机从集合中取出并删除一个元素)
    srandmember key [count]
  • 注 :

  1. 如果 count 为正数,且小于集合基数,那么命令返回一个包含 count 个元素的数组,数组中的元素各不相同。如果 count 大于等于集合基数,那么返回整个集合。
  2. 如果 count 为负数,那么命令返回一个数组,数组中的元素可能会重复出现多次,而数组的长度为 count 的绝对值。

sorted set

有序集合,在集合类型的基础上为集合中的每个元素都关联了一个分数,这样可以很方便的获得分数最高的N个元素(topN)

  • 命令

    1
    2
    3
    4
    5
    zadd/zscore/zrange/zrevrange/
    zrangebyscore ##默认是闭区间,可使用"("使用开区间
    zincrby/zcard/zcount ##获取指定分数范围的元素个数
    zrem
    ##扩展:+inf(正无穷) -inf(负无穷)
  • 更多命令请查看:http://doc.redisfans.com/

java操作redis

  • 使用jedis第三方jar包操作redis , mvn依赖

    1
    2
    3
    4
    5
    <dependency>			   				
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>2.8.0</version>
    </dependency>
  • 实例代码一 : 通过Jedis操作

    1
    2
    3
    4
    5
    6
    @Test
    public void TestRedis(){
    Jedis jedis = new Jedis( "192.168.3.56" , 6379 ) ;
    jedis.set("user:info:xxo","23");
    System.out.println(jedis.get("user:info:xxo"));
    }
  • 实例代码二 : redis连接池

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    @Test
    public void TestRedisPool(){

    //1. 连接池配置
    JedisPoolConfig config = new JedisPoolConfig() ;
    config.setMaxIdle(50); //最大空闲连接
    config.setMaxTotal(100); //最大连接数
    config.setMaxWaitMillis(2000); //最长连接时间
    config.setTestOnBorrow(true); //校验

    //2. 通过连接池获取Jedis
    JedisPool pool = new JedisPool(config, "192.168.3.56", 6379);
    Jedis jedis = pool.getResource(); //获取Jedis

    //3. 通过Jedis操作数据
    jedis.set("user:info:xxo:age", String.valueOf(23)) ;
    System.out.println(jedis.get("user:info:xxo:age"));

    }
  • 实例代码三 : 模拟一个限制非法访问连接

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    @Test
    public void userVisit(){
    for (int i = 0; i < 15; i++) {
    System.out.println(checkIP("192.168.3.59"));
    }
    }

    private boolean checkIP(String ip) {

    //1. 创建一个对象
    Jedis jedis = new Jedis("192.168.3.56", 6379) ;

    //2. 查看ip,如果不存在
    String key = jedis.get(ip);
    if( key == null ){
    jedis.set( ip , "1" );
    jedis.expire( ip , 5 ) ; //有效时间
    }

    //3.是否在5s之类超过限制,这里限制为10次
    else{
    int count = Integer.valueOf( key ) ;
    if( count >= 10 ){
    return false;
    }
    else{
    //jedis.set( ip , (++count)+"" ) ;
    jedis.incr(ip) ;//自动增加1,等于incrBy(ip,1);
    }
    }
    return true ;

    }
  • expire设置一个键的生存时间,到时间后redis会自动删除它。指定时间点expireAt(expireAt [key] unix时间戳)

应用场景:

限时的优惠活动信息
网站数据缓存(对于一些需要定时更新的数据,例如:积分排行榜)
手机验证码(短信验证码)
限制网站访客访问频率(例如:1分钟最多访问10次)

附录相关redis命令

  • 连接操作相关的命令
    quit:关闭连接(connection)
    auth:简单密码认证

  • 持久化
    save:将数据同步保存到磁盘
    bgsave:将数据异步保存到磁盘
    lastsave:返回上次成功将数据保存到磁盘的Unix时戳
    shundown:将数据同步保存到磁盘,然后关闭服务

  • 远程服务控制
    info:提供服务器的信息和统计
    monitor:实时转储收到的请求
    slaveof:改变复制策略设置
    config:在运行时配置Redis服务器

  • 对value操作的命令
    exists(key):确认一个key是否存在
    del(key):删除一个key
    type(key):返回值的类型
    keys(pattern):返回满足给定pattern的所有key
    randomkey:随机返回key空间的一个
    keyrename(oldname, newname):重命名key
    dbsize:返回当前数据库中key的数目
    expire:设定一个key的活动时间(s)
    ttl:获得一个key的活动时间
    select(index):按索引查询
    move(key, dbindex):移动当前数据库中的key到dbindex数据库
    flushdb:删除当前选择数据库中的所有key
    flushall:删除所有数据库中的所有key

  • 对String操作的命令
    set(key, value):给数据库中名称为key的string赋予值value
    get(key):返回数据库中名称为key的string的value
    getset(key, value):给名称为key的string赋予上一次的value
    mget(key1, key2,…, key N):返回库中多个string的value
    setnx(key, value):添加string,名称为key,值为value
    setex(key, time, value):向库中添加string,设定过期时间time
    mset(key N, value N):批量设置多个string的值
    msetnx(key N, value N):如果所有名称为key i的string都不存在
    incr(key):名称为key的string增1操作
    incrby(key, integer):名称为key的string增加integer
    decr(key):名称为key的string减1操作
    decrby(key, integer):名称为key的string减少integer
    append(key, value):名称为key的string的值附加value
    substr(key, start, end):返回名称为key的string的value的子串

  • 对List操作的命令
    rpush(key, value):在名称为key的list尾添加一个值为value的元素
    lpush(key, value):在名称为key的list头添加一个值为value的 元素
    llen(key):返回名称为key的list的长度
    lrange(key, start, end):返回名称为key的list中start至end之间的元素
    ltrim(key, start, end):截取名称为key的list
    lindex(key, index):返回名称为key的list中index位置的元素
    lset(key, index, value):给名称为key的list中index位置的元素赋值
    lrem(key, count, value):删除count个key的list中值为value的元素
    lpop(key):返回并删除名称为key的list中的首元素
    rpop(key):返回并删除名称为key的list中的尾元素
    blpop(key1, key2,… key N, timeout):lpop命令的block版本。
    brpop(key1, key2,… key N, timeout):rpop的block版本。
    rpoplpush(srckey, dstkey):返回并删除名称为srckey的list的尾元素,并将该元素添加到名称为dstkey的list的头部

  • 对Set操作的命令
    sadd(key, member):向名称为key的set中添加元素member
    srem(key, member) :删除名称为key的set中的元素member
    spop(key) :随机返回并删除名称为key的set中一个元素
    smove(srckey, dstkey, member) :移到集合元素
    scard(key) :返回名称为key的set的基数
    sismember(key, member) :member是否是名称为key的set的元素
    sinter(key1, key2,…key N) :求交集
    sinterstore(dstkey, (keys)) :求交集并将交集保存到dstkey的集合
    sunion(key1, (keys)) :求并集
    sunionstore(dstkey, (keys)) :求并集并将并集保存到dstkey的集合
    sdiff(key1, (keys)) :求差集
    sdiffstore(dstkey, (keys)) :求差集并将差集保存到dstkey的集合
    smembers(key) :返回名称为key的set的所有元素
    srandmember(key) :随机返回名称为key的set的一个元素

  • 对Hash操作的命令
    hset(key, field, value):向名称为key的hash中添加元素field
    hget(key, field):返回名称为key的hash中field对应的value
    hmget(key, (fields)):返回名称为key的hash中field i对应的value
    hmset(key, (fields)):向名称为key的hash中添加元素field
    hincrby(key, field, integer):将名称为key的hash中field的value增加integer
    hexists(key, field):名称为key的hash中是否存在键为field的域
    hdel(key, field):删除名称为key的hash中键为field的域
    hlen(key):返回名称为key的hash中元素个数
    hkeys(key):返回名称为key的hash中所有键
    hvals(key):返回名称为key的hash中所有键对应的value
    hgetall(key):返回名称为key的hash中所有的键(field)及其对应的value

  • 参考资料
    http://my.oschina.net/davehe/blog/129082?fromerr=6dre9pGK

当前网速较慢或者你使用的浏览器不支持博客特定功能,请尝试刷新或换用Chrome、Firefox等现代浏览器