如何查看redis中的数据

如何查看redis中的数据,第1张

1、首先双击打开电脑桌面上的Redis Desktop Manager应用程序的快捷方式。

2、打开软件之后,并点击左上角的连接到Redis服务器。

3、打开新增服务器窗口,输入名称、地址、密码(如果Redis服务器需要密码)后测试连接并保存。

4、保存好之后,在左侧打开刚刚添加好的连接,如果连接正常就可以看到Redis服务器的数据了。可以通过该工具添加修改删除数据。

phpredis是php的一个扩展,效率是相当高有链表排序功能,对创建内存级的模块业务关系很有用;

如果对系统存储使用的数据以两种角度分类,一种是按数据的大小划分,分成大数据和小数据,另一种是按数据的冷热程度划分,分成冷数据和热数据,热数据是指读或写比较频繁的数据,反之则是冷数据。

可以举一些具体的例子来说明数据的大小和冷热属性。比如网站总的注册用户数,这明显是一个小而热的数据,小是因为这个数据只有一个值,热是因为注册用户数随时间变化很频繁。再比如,用户最新访问时间数据,这是一个量比较大,冷热不均的数据,大是数据的粒度是用户级别,每一个用户都有数据,如果有一千万用户,就意味着有一千万的数据,冷热不均是因为活跃用户的最新访问时间变化很频繁,但是可能有很大一部非活跃用户访问时间长时间不会发生变化。

大体而言,Redis 最适合处理的是小而热,而且是写频繁,或者读写都比较频繁的热数据。对于大而热的数据,如果其它方式很难解决问题,也可以考虑使用 Redis 解决,但是一定要非常谨慎,防止数据无限膨胀。原因如下:

首先,对于冷数据,无论大小,都不建议放在 Redis 中。Redis 数据要全部放在内存中,资源宝贵,把冷数据放在其中实在是一种浪费,冷数据放在普通的存储比如关系数据库中就好了。

其次,对于热数据,尤其是写频繁的热数据,如果量比较小,是最适合放到 Redis 中的。比如上面提到的网站总的注册用户数,就是典型的 Redis 用做计数器的例子。再比如论坛最新发表列表,最新报名列表,可以控制数量在几百到一千的规模,也是典型的 redis 做最新列表的使用方式。

另外,对于量比较大的热数据(或者冷热不均数据),使用 Redis 时一定要比较谨慎。这种类型数据很容易引起数据膨胀,导致 Redis 消耗内存巨大,让系统难以承受。薄荷的一个惨痛教训是把用户关注(以及被关注)数据放在 Redis 中,这是一种数据量极大,冷热很不均衡的数据,在几百万的用户级别就占用了近 10 GB左右内存,让 Redis 变得难以应付。应对这种类型的数据,可以用普通存储 + 缓存的方式。

如果用对了地方,比如在小而热的数据情形,Redis 表现很棒,如果用错了地方,Redis 也会带来昂贵的代价,所以使用时务必谨慎。

目前在做自动化测试时,设计到需要获取存储在redis中的值,总结了 *** 作代码如下:

需要jar包:jedis-273jar、commons-pool2-241jar

code如下:

[java] view plain copy

package cnmiguutils;

import javautilIterator;

import javautilList;

import cnmigubaseGlobalSettings;

import redisclientsjedisJedis;

import redisclientsjedisJedisPool;

import redisclientsjedisJedisPoolConfig;

/

 <Description>redis相关 *** 作类

 @author YanLu

/

public class RedisUtil {

private JedisPool pool=null;

private Jedis redis = null;

Log4jUtil log = new Log4jUtil(thisgetClass()getName());

//构造函数,创建对象时进行初始化

public RedisUtil() {

if (pool == null) {

/

// 池基本配置

//JedisPoolConfig config = new JedisPoolConfig();

// 最大连接数, 默认8个

configsetMaxTotal(20);

// 控制一个pool最多有多少个状态为idle(空闲的)的jedis实例。

configsetMaxIdle(5);

// 表示当borrow(引入)一个jedis实例时,最大的等待时间,如果超过等待时间,则直接抛出JedisConnectionException;

configsetMaxWaitMillis(10000);

// 在borrow一个jedis实例时,是否提前进行validate *** 作;如果为true,则得到的jedis实例均是可用的;

configsetTestOnBorrow(false);

/

//创建redis连接池

//thispool = new JedisPool(config,"17218173188",6379);

thispool = new JedisPool(new JedisPoolConfig(), GlobalSettingsgetProperty("redismasterhost"), IntegerparseInt(GlobalSettingsgetProperty("redismasterport")));

//获取Jedis实例

thisredis = poolgetResource();

loginfo("Connection to redis server sucessfully");

}

}

/

 关闭连接

 @param pool

 @param redis

/

public void quitConnection(Jedis redis) {

if (redis != null) {

redisquit();

//poolreturnResource(redis);

}

}

/

 获取key对应的value

 说明:方法中目前只针对key数据类型为String和hash的情况作了处理,其他数据类型可根据需要进行扩展即可

 @param key

 @return

/

public String getValue(String key){

String value = null;

try {

if(redis == null || !redisexists(key)){

loginfo("key:"+key+" is not found");

quitConnection(redis);

return value;

}

//获取key对应的数据类型

String type = redistype(key);

loginfo("key:" + key + " 的类型为:" + type);

if(typeequals("string")){

//get(key)方法返回key所关联的字符串值

value = redisget(key);

}

if(typeequals("hash")){

//一下方法仅适用于listsize=1时,否者value将取集合中最后一个元素的值

List<String> list = redishvals(key);//hvals(key)返回哈希表 key 中所有域的值

//Set<String> set = redishkeys(key);

Iterator<String> it=listiterator();

while(ithasNext()){

value = itnext();

loginfo("value:"+value);

}

}

if(typeequals("list")){

loginfo(key+"类型为list暂未处理");

}

if(typeequals("set")){

loginfo(key+"类型为list暂未处理");

}

} catch (Exception e) {

// TODO Auto-generated catch block

eprintStackTrace();

}finally{

//关闭连接

quitConnection(redis);

}

return value;

}

[java] view plain copy

</pre><p></p><p></p><p>测试代码如下:</p><p><pre name="code" class="java">package cnmigutest;

import orgtestngannotationsTest;

import cnmiguutilsLog4jUtil;

import cnmiguutilsRedisUtil;

/

 <Description> 测试RedisUtil类

 @author YanLu

/

public class TestRedis {

private Log4jUtil log = new Log4jUtil(thisgetClass()getName());

@Test

public void testRedisUtil(){

RedisUtil ru = new RedisUtil();

//获取redis中对应的value值

String value=rugetValue("SMS_NODE_TIMES_13814528620");

loginfo(value);

}

}

1

设置一个string类型的key和value:(重复添加值会覆盖)

命令:set

2

设置一个key的值string类型的value,

key值不存在则添加,key值存在则返回0:

命令:setnx

3

设置一个键值的有效期:

命令:setex

#nil 表示为空,没有的意思、不存在

4

设置指定key的value值的子字符串:

命令:setrange

一次设置多个key的值、成功返回ok、失败返回0:

命令:mset

------------------------------------------

一次获取多个key的值、成功返回ok、失败返回0:

命令:mget

设置多个value、不覆盖已存在的key:

命令:msetnx

获取key对应的value值(nil)

命令:get

---------------------------------

设置key的值,并返回key的旧值

getset

获取key的value值的字符串:

命令:getrange

对key的值做加加 *** 作,并返回新的值:

命令:incr(类似于i++)

加指定值,key不存在设置key,并认为原来的值为0:

命令:incrby

对key的值做减减 *** 作:

命令:decr

同decr类似,减<指定值>:

命令:decrby

给指定的key的字符串追加value,返回新字符串值的长度:

命令:append

取指定key的value值的长度:

命令:strlen

可以使用命令:redis-cli

-p端口

-hIP地址

keys

""

|wc

-l

如果是集群:redis-cli

-c

-p端口

-hIP地址

keys

""

|wc

-l(多了个-c)

注意keys

命令只能列出当前的节点的key的数量

        String是redis最基础和最常用的数据结构,其值最大能存储 512MB,可以是简单字符串、复杂的xml/json的字符串、二进制图像或者音频的字符串、以及可以是数字的字符串。String底层使用的是SDS,是Redis的一种基本数据结构,主要是用于存储字符串和整数。

    21  set命令  set key value

        用于设置给定key的值,如果key存储了其他值,覆盖写入,无视类型。

    22 get命令 get key

        获取指定key的值,如果key不存在返回nil

    23 getset命令 get key [value]

        该命令用于获取指定的key的旧值,然后按照新值对key进行赋值。当key中没有旧值的时候返回nil。

    24 mget命令 get key1 [key2 keyN]

        返回多个key的值,某个key不存在时返回nil

    25 decr命令 decr key

        对key对应的数字做减1 *** 作。如果key不存在,那么在 *** 作之前,这个key对应的值会被置为0。如果key有一个错误类型的value或者是一个不能表示成数字的字符串,就返回错误。

    26 incr命令 incr key

        对key对应的数字做减1 *** 作。如果key不存在,那么在 *** 作之前,这个key对应的值会被置为0。如果key有一个错误类型的value或者是一个不能表示成数字的字符串,就返回错误。

    27 append命令 append key value

    如果 key 已经存在,并且值为字符串,那么这个命令会把 value 追加到原来值(value)的结尾。 如果 key 不存在,那么它将首先创建一个空字符串的key,再执行追加 *** 作,这种情况 APPEND 将类似于 SET *** 作。返回append后字符串值(value)的长度。

    31 SDS动态字符串

        struct sdshdr {

            unsigned int len;

            unsigned int free;

            char buf[];

        }

        其中,buf表示数据空间,用于存储字符串;len表示buf中已占用的字节数;free表示空闲的字节数。

    32 新的SDS结构

        增加了一个flags来标识类型,用一个字节(8位)来存储,前3位表示字符串的类型;剩余5位,存储长度小于32的段字符串。

        创建 SDS 的大致流程是这样的:首先根据字符串长度计算得到 type,根据 type 计算头部所需长度,然后动态分配内存空间。

        注意:① 创建空字符串时,SDS_TYPE_5 被强制转换为 SDS_TYPE_8(原因是创建空字符串后,内容可能会频繁更新而引发扩容 *** 作,故直接创建为 sdshdr8)

                    ②长度计算有 +1 *** 作,因为结束符 \0 会占用一个长度的空间。

                    ③返回的是指向 buf 的指针 s。

    41 session共享

    42 计数器(商品浏览记录)

     43 访问限速

    list类型用来存储多个有序的字符串,列表当中的每一个字符看做一个元素,一个列表当中可以存储有一个或者多个元素,redis的list支持存储2^32次方-1个元素。

    Redis可以从两端push和pop元素,支持读取指定范围或者制定下表的元素。list是一种灵活的链式结构,可以充当队列或者栈的角色。

    list的元素是有序的,且列表内的元素是可以重复的。

    注意:Redis32以前,列表底层的编码是ziplist(压缩列表)和linkedlist(双向列表)实现的,因为双线列表占用的内存比压缩列表多,所以当创建新的列表键时,列表会优先考虑用压缩列表,只有在需要的时候才会转换到双向列表实现。32以后重新引入了一个quicklist,列表底层都是有quicklist实现,quicklist是一个由ziplist组成的双向列表,每个节点使用ziplist来存储数据。

       21 Lpush命令 lpush key value

        将一个或多个值插入到列表头部。 如果 key 不存在,则创建list,然后再插入数据 *** 作。 当 key 存在但不是列表类型时,返回一个错误。

    22 Rpush命令 rpush key value

        将一个或多个值从list的尾部插入

    23 Blpop命令 blpop key seconds

        Blpop是取出列表的第一个元素,如果list中没有元素则会一直等到到超时,或者发现有数据为止,seconds是指定多少秒返回。如没有数据,则返回nil。

        同理,Bropo为移除list列表的最后一个元素

    24 Linsert命令 linsert key before/after val1 val2

        在list列表的某一个元素前或者后插入另外一个元素。当指的的元素不存在时,不执行任何动作。如果列表不存在时,视为空列表,不执行任何动作。

    25 Lindex命令 lindex key index

        通过链表的下标获取列表中的元素,可以是-1表示链表最后一个元素,-2代表倒数第二个元素,没有返回nil

    26 Llen命令 llen key

        返回list的长度,如果list不存在,返回0

    27 Lrange命令

        返回指定list区间内的元素,区间以偏移量start和end决定。其中 0 表示列表的第一个元素, 1 表示列表的第二个元素,以此类推。 也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。

    51 队列秒杀抢购

        list类型的lpop和rpush(或者反过来,lpush和rpop)能实现队列的功能,故而可以用Redis的list类型实现简单的点对点的消息队列。不过不推荐在实战中这么使用,因为现在已经有Kafka、NSQ、RabbitMQ等成熟的消息队列了,它们的功能已经很完善了,除非是为了更深入地理解消息队列,不然没必要去重复造轮子。

    52 排行榜

        list类型的lrange命令可以分页查看队列中的数据。可将每隔一段时间计算一次的排行榜存储在list类型中。只有定时计算的排行榜才适合使用list类型存储,与定时计算的排行榜相对应的是实时计算的排行榜,list类型不能支持实时计算的排行榜。

Redis的get和hget *** 作的性能一般比较高,可以获得比HashSet等其他数据结构更快的读性能。因为Redis有装载到内存中,所以可以提供更快的查询速度,而hashset则需要在硬盘中查询,所以效率会更低。

以上就是关于如何查看redis中的数据全部的内容,包括:如何查看redis中的数据、php redis Hash 怎么通过 一个指定的value 查找到对应的 key 值、为什么用redismanager查看key中的value是0代码get出来是OK等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9302865.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-26
下一篇2023-04-26

发表评论

登录后才能评论

评论列表(0条)

    保存