• redis常用命令


    1.1        Redis命令

    ps -ef |grep redis

    指定端口:bind 127.0.0.1   我们要注释掉,让所有端口都能进入。

    1.1.1    redis-cli的使用之发送命令

    默认连接:IP 127.0.0.1 端口 6379

    redis-cli

    指定IP端口:

        redis-cli –h 127.0.0.1 –p 6379

    1.1.2    redis-cli的使用之命令返回值

    状态回复(最简单的回复-redis提供的测试命令)

    redis>PING

    PONG

    127.0.0.1:6379>INCR test_incr

    (integer) 1

    字符串回复(最长久的一种回复,双引号包裹)

    127.0.0.1:6379>get test

    “123”

    多行字符串回复

    127.0.0.1:6379>KEYS *

    1) "test_incr"

    2) "test"

    1.1.3    redis数据库切换SELECT

    redis默认支持16个数据库,对外都是以一个从0开始的递增数字命名,可以通过参数database来修改默认数据库个数。客户端连接redis服务后会自动选择0号数据库,可以通过select命令更换数据库,例如选择1号数据库:

    127.0.0.1:6379>SELECT 1

    OK

    127.0.0.1:6379>GET test

    (nil)

    说明:

    Redis不支持自定义数据库名称。

    Redis不支持为每个数据库设置访问密码。

    Redis的多个数据库之间不是安全隔离的,FLUSHALL命令会清空所有数据库的数据。

    1.1.4    redis的基本命令之KEYS

    获取符合规则的建名列表。

    KEYS *

    keys test[_]*

    keys t[a-d]

    说明:

    ?  匹配一个字符

    *   匹配任意个(包括0个)字符

    []  匹配括号间的任一字符,可以使用“-“表示范围。如a[a-d]匹配ab/ac/ad

    x  匹配字符x,用于转义符合,如果要匹配“?“就需要使用?

    1.1.5    redis的基本命令之EXISTS

    判断一个键是否存在。

    如果键存在则返回整数类型1,否则返回0。

    127.0.0.1:6379> keys *

    1) "test_incr"

    2) "test"

    127.0.0.1:6379> exists test

    (integer) 1

    127.0.0.1:6379> exists test1

    (integer) 0

    127.0.0.1:6379>

    1.1.6    redis的基本命令之DEL

    删除键,可以删除一个或者多个键,多个键用空格隔开,返回值是删除的键的个数。

    127.0.0.1:6379> del test

    (integer) 1

    127.0.0.1:6379> del test

    (integer) 0

    127.0.0.1:6379> del test test_incr

    (integer) 1

    1.1.7    redis的基本命令之TYPE

    获得键值的数据类型,返回值可能是string(字符串)、hash(散列类型)、list(列表类型)、set(集合类型)、zset(有序集合类型)。

    127.0.0.1:6379> keys *

    1) "test1"

    2) "test"

    127.0.0.1:6379> type test

    string

    127.0.0.1:6379> type test1

    string

    1.1.8    redis的基本命令之FLUSHALL

    清空所有数据库。

    127.0.0.1:6379> FLUSHALL

    OK

    1.1.9  redis的基本命令之FLUSHDB

    清空当前数据库。

    127.0.0.1:6379> FLUSHDB

    OK

    1.2        Redis数据类型之字符串

    存放的字符串为二进制是安全的。字符串长度支持到512M。

    1.2.1    基本命令KEYS GET SET

    字符串类型是redis中最基本的数据类型,它能存储任何形式的字符串,包括二进制数据。可以存储JSON化的对象、字节数组等。一个字符串类型键允许存储的数据最大容量是512MB。

    赋值与取值:

    SET key value

    GET key

    127.0.0.1:6379> keys *

    (empty list or set)

    127.0.0.1:6379> set test 123

    OK

    127.0.0.1:6379> set test1 ab

    OK

    127.0.0.1:6379> keys *

    1) "test1"

    2) "test"

    127.0.0.1:6379> get test

    "123"

    127.0.0.1:6379> get test1

    "abc"

    127.0.0.1:6379> get test2

    (nil)

    127.0.0.1:6379>

    1.2.2    自增INCR/INCRBY

    递增数字INCR key

    当存储的字符串是整数时,redis提供了一个实用的命令INCR,其作用是让当前键值递增,并返回递增后的值。

    127.0.0.1:6379> incr num

    (integer) 1

    127.0.0.1:6379> incr num

    (integer) 2

    如果num不存在,则自动会创建,如果存在自动+1。

    指定增长系数

    语法:INCRBY key increment

    127.0.0.1:6379> incr num

    (integer) 2

    127.0.0.1:6379> incr num

    (integer) 3

    127.0.0.1:6379> incrby num 2

    (integer) 5

    127.0.0.1:6379> incrby num 2

    (integer) 7

    127.0.0.1:6379> incrby num 2

    (integer) 9

    127.0.0.1:6379> incr num

    (integer) 10

    127.0.0.1:6379>

    1.2.3    自减DECR/DECRBY

    减少指定的整数

    DECR key

    DECRBY key decrement

    127.0.0.1:6379> incr num

    (integer) 10

    127.0.0.1:6379> decr num

    (integer) 9

    127.0.0.1:6379> decrby num 3

    1.2.4    自加浮点INCRBYFLOAT

    整数时,第一次加可以得到正确结果,浮点数后再加浮点就会出现精度问题。

    原来下面的例子2.8.7注意在新版本中已经修正了这个浮点精度问题。3.0.7

    INCRBYFLOAT key decrement

    127.0.0.1:6379>set num

    (integer) 131

    127.0.0.1:6379>incrfloat num 0.7

    “131.7”

    127.0.0.1:6379>incrfloat num 0.7

    “132.3999999999999999”

    1.2.5    尾部追加APPEND

    向尾部追加值。如果键不存在则创建该键,其值为写的value,即相当于SET key value。返回值是追加后字符串的总长度。

    语法:APPEND key value

    127.0.0.1:6379> keys *

    1) "num"

    2) "test1"

    3) "test"

    127.0.0.1:6379> get test

    "123"

    127.0.0.1:6379> append test "abc"

    (integer) 6

    127.0.0.1:6379> get test

    "123abc"

    127.0.0.1:6379>

    1.2.6    获取字符串长度STRLEN

    字符串长度,返回数据的长度,如果键不存在则返回0。注意,如果键值为空串,返回也是0。

    语法:STRLEN key

    127.0.0.1:6379> get test

    "123abc"

    127.0.0.1:6379> strlen test

    (integer) 6

    127.0.0.1:6379> strlen tnt

    (integer) 0

    127.0.0.1:6379> set tnt ""

    OK

    127.0.0.1:6379> strlen tnt

    (integer) 0

    127.0.0.1:6379> exists tnt

    (integer) 1

    127.0.0.1:6379>

    1.2.7    多个MSET MGET

    同时设置/获取多个键值

    语法:MSET key value [key value …]

          MGET key [key …]

    127.0.0.1:6379> flushall

    OK

    127.0.0.1:6379> keys *

    (empty list or set)

    127.0.0.1:6379> mset a 1 b 2 c 3

    OK

    127.0.0.1:6379> mget a b c

    1) "1"

    2) "2"

    3) "3"

    127.0.0.1:6379>

    1.3        Redis生存时间

    1.3.1    Redis之生存时间EXPIRE

    Redis在实际使用过程中更多的用作缓存,然而缓存的数据一般都是需要设置生存时间的,即到期后数据销毁。

    语法:EXPIRE key seconds

    127.0.0.1:6379> flushall

    OK

    127.0.0.1:6379> set bomb tnt

    OK

    127.0.0.1:6379> expire bomb 10

    (integer) 1

    127.0.0.1:6379> ttl bomb

    (integer) 5

    127.0.0.1:6379> ttl bomb

    (integer) 3

    127.0.0.1:6379> ttl bomb

    (integer) 3

    127.0.0.1:6379> ttl bomb

    (integer) 2

    127.0.0.1:6379> ttl bomb

    (integer) 1

    127.0.0.1:6379> ttl bomb

    (integer) -2

    127.0.0.1:6379> ttl bomb

    (integer) -2

    127.0.0.1:6379>

    TTL查看key的剩余时间,当返回值为-2时,表示键被删除。

    当 key 不存在时,返回 -2 。当 key 存在但没有设置剩余生存时间时,返回 -1 。否则,以毫秒为单位,返回 key 的剩余生存时间。

    注意:在 Redis 2.8 以前,当 key 不存在,或者 key 没有设置剩余生存时间时,命令都返回 -1 。

    1.3.2    清除生存时间PERSIST

    语法:PERSIST key

    127.0.0.1:6379> set bomb tnt

    OK

    127.0.0.1:6379> expire bomb 60

    (integer) 1

    127.0.0.1:6379> ttl bomb

    (integer) 49

    127.0.0.1:6379> persist bomb

    (integer) 1

    127.0.0.1:6379> ttl bomb

    (integer) -1

    127.0.0.1:6379>

    设置新的数据时需要重新设置该key的生存时间。重新设置值也会清除生存时间。

    1.3.3    设置生存时间单位为毫秒PEXPIRE

    语法:PEXPIRE key milliseconds

    127.0.0.1:6379> set bomb tnt

    OK

    127.0.0.1:6379> pexpire bomb 10000

    (integer) 1

    127.0.0.1:6379> ttl bomb

    (integer) 6

    127.0.0.1:6379> ttl bomb

    (integer) 3

    127.0.0.1:6379> ttl bomb

    (integer) -2

    127.0.0.1:6379>

    设置生存时间为毫秒,可以做到更精确的控制。

    1.4        安装两个服务

    1.4.1    打开6379端口

    /sbin/iptables -I INPUT -p tcp --dport 6379 -j ACCEPT

    /etc/rc.d/init.d/iptables save      #修改生效

    /etc/init.d/iptables status         #查看配置

    1.4.2    复制改端口无需再次安装

    只需要复制配置文件,启动时选择配置文件即可。

    #cd /usr/local/src/redis/redis.2.8.17

    #cp redis.conf redis6380.conf

    #vi redis6380.conf    #修改端口为6380

    #redis-server redis6380.conf

    注意:启动后,会残留些数据,不完全,必须flushall清除掉。

    1.5        Jedis

    访问redis的驱动包。

    使用最为广泛的是Jedis和Redisson(官方推荐),在企业中采用最多的是Jedis,我们重点学习Jedis。

    Jedis官网地址:https://github.com/xetorthio/jedis

    1.5.1    第一个jedis示例

    package redis;

    import java.util.List;

    import redis.clients.jedis.Jedis;

    public class TestRedis {

        public static void main(String[] args) {

           //设置连接服务器IP地址和访问端口

           Jedis jedis = new Jedis("192.168.115.115",6379);

           //单个值

           //jedis.set("test", "456789");             //设置值

           //System.out.println(jedis.get("test"));    //获取值

           //多个值

           //jedis.mset("test1","1","test2","2");

           List<String> oList = jedis.mget("test1","test2");

           for(String s : oList){

               System.out.println(s);

           }

           jedis.close(); //关闭

        }

    }

    命令窗口:

    127.0.0.1:6379> keys *

    1) "bomb"

    127.0.0.1:6379> get bomb

    "tnt"

    127.0.0.1:6379>

    1.5.2    连接池JedisPool创建jedis连接

    package cn.redis;

    import redis.clients.jedis.Jedis;

    import redis.clients.jedis.JedisPool;

    import redis.clients.jedis.JedisPoolConfig;

    public class JedisPoolDemo {

        public static void main(String[] args) {

            // 构建连接池配置信息

    JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();

            // 设置最大连接数

            jedisPoolConfig.setMaxTotal(200);

            // 构建连接池

    JedisPool jedisPool = new JedisPool(jedisPoolConfig, "127.0.0.1", 6379);

            // 从连接池中获取连接

            Jedis jedis = jedisPool.getResource();

            // 读取数据

            System.out.println(jedis.get("bomb"));

            // 将连接还回到连接池中

            jedisPool.returnResource(jedis);

            // 释放连接池

            jedisPool.close();

        }

    }

    1.5.3    分片ShardedJedisPool

    Redis多个节点的透明访问

    package cn.redis;

    import java.util.ArrayList;

    import java.util.List;

    import redis.clients.jedis.JedisPoolConfig;

    import redis.clients.jedis.JedisShardInfo;

    import redis.clients.jedis.ShardedJedis;

    import redis.clients.jedis.ShardedJedisPool;

    /**

     * 集群式的连接池

     *

     */

    public class ShardedJedisPoolDemo {

        public static void main(String[] args) {

            // 构建连接池配置信息

            JedisPoolConfig poolConfig = new JedisPoolConfig();

            // 设置最大连接数

            poolConfig.setMaxTotal(50);

            // 定义集群信息

    List<JedisShardInfo> shards = new ArrayList<JedisShardInfo>();

            shards.add(new JedisShardInfo("127.0.0.1", 6379));

            shards.add(new JedisShardInfo("127.0.0.1", 6380));

            // 定义集群连接池

            ShardedJedisPool shardedJedisPool = new ShardedJedisPool(poolConfig, shards);

            ShardedJedis shardedJedis = null;

            try {

                // 从连接池中获取到jedis分片对象

                shardedJedis = shardedJedisPool.getResource();

                for (int i = 0; i < 100; i++) {

                    shardedJedis.set("bomb_"+i, "tnt" + i);

                }

                // 从redis中获取数据

                String value = shardedJedis.get("bomb_40");

                System.out.println(value);

     

                value = shardedJedis.get("bomb_47");

                System.out.println(value);

            } catch (Exception e) {

                e.printStackTrace();

            } finally {

                if (null != shardedJedis) {

                    // 关闭,检测连接是否有效,有效则放回到连接池中,无效则重置状态

                    shardedJedis.close();

                }

            }

            // 关闭连接池

            shardedJedisPool.close();

        }

    }

    1.6    Redis高级中的list结构

    在redis中用的最多的就是hash和string类型。

    1.6.1    问题

    Redis的list类型其实就是一个每个子元素都是string类型的双向链表。链表的最大长度是(2的32次方)。我们可以通过push,pop操作从链表的头部或者尾部添加删除元素。这使得list既可以用作栈,也可以用作队列。

    有意思的是list的pop操作还有阻塞版本的,当我们[lr]pop一个list对象时,如果list是空,或者不存在,会立即返回nil。但是阻塞版本的b[lr]pop可以则可以阻塞,当然可以加超时时间,超时后也会返回nil。为什么要阻塞版本的pop呢,主要是为了避免轮询。举个简单的例子如果我们用list来实现一个工作队列。执行任务的thread可以调用阻塞版本的pop去获取任务这样就可以避免轮询去检查是否有任务存在。当任务来时候工作线程可以立即返回,也可以避免轮询带来的延迟。

    1.6.2    LPUSH

    在key对应list的头部添加字符串元素

    redis 127.0.0.1:6379> lpush mylist "world"

    (integer) 1

    redis 127.0.0.1:6379> lpush mylist "hello"

    (integer) 2

    redis 127.0.0.1:6379> lrange mylist 0 -1

    1) "hello"

    2) "world"

    redis 127.0.0.1:6379>

    1.6.3    RPUSH

    在key对应list的尾部添加字符串元素

    redis 127.0.0.1:6379> rpush mylist2 "hello"

    (integer) 1

    redis 127.0.0.1:6379> rpush mylist2 "world"

    (integer) 2

    redis 127.0.0.1:6379> lrange mylist2 0 -1

    1) "hello"

    2) "world"

    redis 127.0.0.1:6379>

    1.6.4    linsert

    在key对应list的特定位置之前或之后添加字符串元素

    redis 127.0.0.1:6379> rpush mylist3 "hello"

    (integer) 1

    redis 127.0.0.1:6379> rpush mylist3 "world"

    (integer) 2

    redis 127.0.0.1:6379> linsert mylist3 before "world" "there"

    (integer) 3

    redis 127.0.0.1:6379> lrange mylist3 0 -1

    1) "hello"

    2) "there"

    3) "world"

    redis 127.0.0.1:6379>

    1.6.5    lset

    设置list中指定下标的元素值

    redis 127.0.0.1:6379> rpush mylist4 "one"

    (integer) 1

    redis 127.0.0.1:6379> rpush mylist4 "two"

    (integer) 2

    redis 127.0.0.1:6379> rpush mylist4 "three"

    (integer) 3

    redis 127.0.0.1:6379> lset mylist4 0 "four"

    OK

    redis 127.0.0.1:6379> lset mylist4 -2 "five"

    OK

    redis 127.0.0.1:6379> lrange mylist4 0 -1

    1) "four"

    2) "five"

    3) "three"

    redis 127.0.0.1:6379>

    1.6.6    lrem

    从key对应list中删除count个和value相同的元素,count>0时,按从头到尾的顺序删除

    redis 127.0.0.1:6379> rpush mylist5 "hello"

    (integer) 1

    redis 127.0.0.1:6379> rpush mylist5 "hello"

    (integer) 2

    redis 127.0.0.1:6379> rpush mylist5 "foo"

    (integer) 3

    redis 127.0.0.1:6379> rpush mylist5 "hello"

    (integer) 4

    redis 127.0.0.1:6379> lrem mylist5 2 "hello"

    (integer) 2

    redis 127.0.0.1:6379> lrange mylist5 0 -1

    1) "foo"

    2) "hello"

    redis 127.0.0.1:6379>

    count<0时,按从尾到头的顺序删除

    redis 127.0.0.1:6379> rpush mylist6 "hello"

    (integer) 1

    redis 127.0.0.1:6379> rpush mylist6 "hello"

    (integer) 2

    redis 127.0.0.1:6379> rpush mylist6 "foo"

    (integer) 3

    redis 127.0.0.1:6379> rpush mylist6 "hello"

    (integer) 4

    redis 127.0.0.1:6379> lrem mylist6 -2 "hello"

    (integer) 2

    redis 127.0.0.1:6379> lrange mylist6 0 -1

    1) "hello"

    2) "foo"

    redis 127.0.0.1:6379>

    count=0时,删除全部

    redis 127.0.0.1:6379> rpush mylist7 "hello"

    (integer) 1

    redis 127.0.0.1:6379> rpush mylist7 "hello"

    (integer) 2

    redis 127.0.0.1:6379> rpush mylist7 "foo"

    (integer) 3

    redis 127.0.0.1:6379> rpush mylist7 "hello"

    (integer) 4

    redis 127.0.0.1:6379> lrem mylist7 0 "hello"

    (integer) 3

    redis 127.0.0.1:6379> lrange mylist7 0 -1

    1) "foo"

    redis 127.0.0.1:6379>

    1.6.7    ltrim

    保留指定key 的值范围内的数据

    redis 127.0.0.1:6379> rpush mylist8 "one"

    (integer) 1

    redis 127.0.0.1:6379> rpush mylist8 "two"

    (integer) 2

    redis 127.0.0.1:6379> rpush mylist8 "three"

    (integer) 3

    redis 127.0.0.1:6379> rpush mylist8 "four"

    (integer) 4

    redis 127.0.0.1:6379> ltrim mylist8 1 -1

    OK

    redis 127.0.0.1:6379> lrange mylist8 0 -1

    1) "two"

    2) "three"

    3) "four"

    redis 127.0.0.1:6379>

    1.6.8    lpop

    从list的头部删除元素,并返回删除元素

    redis 127.0.0.1:6379> lrange mylist 0 -1

    1) "hello"

    2) "world"

    redis 127.0.0.1:6379> lpop mylist

    "hello"

    redis 127.0.0.1:6379> lrange mylist 0 -1

    1) "world"

    redis 127.0.0.1:6379>

    1.6.9    rpop

    从list的尾部删除元素,并返回删除元素:

    redis 127.0.0.1:6379> lrange mylist2 0 -1

    1) "hello"

    2) "world"

    redis 127.0.0.1:6379> rpop mylist2

    "world"

    redis 127.0.0.1:6379> lrange mylist2 0 -1

    1) "hello"

    redis 127.0.0.1:6379>

    1.6.10    rpoplpush

    从第一个list的尾部移除元素并添加到第二个list的头部,最后返回被移除的元素值,整个操作是原子的.如果第一个list是空或者不存在返回nil:

    redis 127.0.0.1:6379> lrange mylist5 0 -1

    1) "three"

    2) "foo"

    3) "hello"

    redis 127.0.0.1:6379> lrange mylist6 0 -1

    1) "hello"

    2) "foo"

    redis 127.0.0.1:6379> rpoplpush mylist5 mylist6

    "hello"

    redis 127.0.0.1:6379> lrange mylist5 0 -1

    1) "three"

    2) "foo"

    redis 127.0.0.1:6379> lrange mylist6 0 -1

    1) "hello"

    2) "hello"

    3) "foo"

    redis 127.0.0.1:6379>

    1.6.11    lindex

    返回名称为key的list中index位置的元素:

    redis 127.0.0.1:6379> lrange mylist5 0 -1

    1) "three"

    2) "foo"

    redis 127.0.0.1:6379> lindex mylist5 0

    "three"

    redis 127.0.0.1:6379> lindex mylist5 1

    "foo"

    redis 127.0.0.1:6379>

    1.6.12    llen

    返回key对应list的长度:

    redis 127.0.0.1:6379> llen mylist5

    (integer) 2

    redis 127.0.0.1:6379>

    1.7   Redis高级中的hash结构

    在redis中用的最多的就是hash和string类型。

    1.7.1    问题

    假设有User对象以JSON序列化的形式存储到redis中,User对象有id、username、password、age、name等属性,存储的过程如下:

    保存、更新:

    User对象->json(string)->redis

    如果在业务上只是更新age属性,其他的属性并不做更新应该怎么做呢?

    Redis数据类型之散列类型hash

    散列类型存储了字段(field)和字段值的映射,但字段值只能是字符串,不支持其他类型,也就是说,散列类型不能嵌套其他的数据类型。一个散列类型可以包含最多232-1个字段。

     

    1.7.2    HSET和HGET赋值和取值

    HSET key field value

    HGET key field

    HMSET key field value [field value…]

    HMGET key field value [field value…]

    HGETALL key

     

    127.0.0.1:6379> hset user username chenchen

    (integer) 1

    127.0.0.1:6379> hget user username

    "chenchen"

    127.0.0.1:6379> hset user username chen

    (integer) 0

    127.0.0.1:6379> keys user

    1) "user"

    127.0.0.1:6379> hgetall user

    1) "username"

    2) "chen"

    127.0.0.1:6379>

    127.0.0.1:6379> hset user age 30

    (integer) 1

    127.0.0.1:6379> hgetall user

    1) "username"

    2) "chen"

    3) "age"

    4) "30"

    127.0.0.1:6379>

    HSET命令不区分插入和更新操作,当执行插入操作时HSET命令返回1,当执行更新操作时返回0。

    1.7.3    HMSET和HMGET设置和获取对象属性

    127.0.0.1:6379> hmset person username tony age 18

    OK

    127.0.0.1:6379> hmget person age username

    1) "18"

    2) "tony"

    127.0.0.1:6379> hgetall person

    1) "username"

    2) "tony"

    3) "age"

    4) "18"

    127.0.0.1:6379>

    注意:上面HMGET字段顺序可以自行定义

    1.7.4    HEXISTS属性是否存在

    127.0.0.1:6379> hexists killer

    (error) ERR wrong number of arguments for 'hexists' command

    127.0.0.1:6379> hexists killer a

    (integer) 0

    127.0.0.1:6379> hexists user username

    (integer) 1

    127.0.0.1:6379> hexists person age

    (integer) 1

    127.0.0.1:6379>

    1.7.5    HDEL删除对象字段

    127.0.0.1:6379> hdel user age

    (integer) 1

    127.0.0.1:6379> hgetall user

    1) "username"

    2) "chen"

    127.0.0.1:6379> hgetall person

    1) "username"

    2) "tony"

    3) "age"

    4) "18"

    127.0.0.1:6379>

    1.7.6    只获取字段名HKEYS或字段值HVALS

    127.0.0.1:6379> hkeys person

    1) "username"

    2) "age"

    127.0.0.1:6379> hvals person

    1) "tony"

    2) "18"

    1.7.7    获取字段数量HLEN

    127.0.0.1:6379> hlen user

    (integer) 1

    127.0.0.1:6379> hlen person

    (integer) 2

    127.0.0.1:6379>

    1.7.8    Jredis示例

    package cn.redis;

     

    import java.util.Map;

     

    import redis.clients.jedis.Jedis;

    import redis.clients.jedis.JedisPool;

    import redis.clients.jedis.JedisPoolConfig;

     

    public class JedisPoolDemoCMD {

     

        public static void main(String[] args) {

            // 构建连接池配置信息

            JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();

            // 设置最大连接数

            jedisPoolConfig.setMaxTotal(50);

     

            // 构建连接池

            JedisPool jedisPool = new JedisPool(jedisPoolConfig, "127.0.0.1", 6379);

     

            // 从连接池中获取连接

            Jedis jedis = jedisPool.getResource();

     

            jedis.hset("USER_1", "username", "zhangsan");

            jedis.hset("USER_1", "password", "123456");

     

            Map<String, String> val = jedis.hgetAll("USER_1");

            for (Map.Entry<String, String> entry : val.entrySet()) {

                System.out.println(entry.getKey() + "  " + entry.getValue());

            }

     

            // 将连接还回到连接池中

            jedisPool.returnResource(jedis);

     

            // 释放连接池

            jedisPool.close();

     

        }

     

    }

    Redis中测试:

    127.0.0.1:6379> hgetall USER_1

    1) "username"

    2) "zhangsan"

    3) "password"

    4) "123456"

    127.0.0.1:6379> hgetall user_1

    (empty list or set)

    127.0.0.1:6379>

    注意:key值的大小写是区分的。

    1.8    Redis的缺点

    1.8.1    持久化

    redis直接将数据存储到内存中,可通过两种方式持久化:定时快照和基于语句的追加。定时快照的方法是指每隔一段时间将整个数据库的数据写到磁盘上,很明显,每次均是写全部数据,代价非常高;而基于语句的追加方法值追踪变化的数据,这类似于MySQL的binlog方法,但追加log可能过大,同时所有操作均要重新执行一遍,回写速度慢。

    1.8.2    耗内存

    尽管redis对一些数据结构采用了压缩法存储,但是用内存量还是过高。

    1.9    Redis应用举例

    1) 缓存(数据查询、短连接、新闻内容、商品内容等等)。(最多使用)

    2)分布式集群架构中的session分离。

    3)聊天室的在线好友列表。

    4)任务队列。(秒杀、抢购、12306等等)(先进先出)

    5)应用排行榜。(可以给每个元素设置一个打分,这样就可以排序)

    6)网站访问统计。

    7)数据过期处理(可以精确到毫秒)。

  • 相关阅读:
    8. Java 异常
    9. GUI编程
    生成验证码
    使用response实现文件的下载
    关于小程序的几个坑
    关于redux应用
    关于修改react的启动端口
    react 坑总结
    关于小程序的一些坑的总结
    微信开发者工具 跨域问题
  • 原文地址:https://www.cnblogs.com/wangfg/p/6895004.html
Copyright © 2020-2023  润新知