ITKeyword - 技术文章推荐分享

首页 > redis数据类型以及常用的命令

redis数据类型以及常用的命令

标签: redis,

相关推荐:实时投票系统:数据类型上的差异:memcache和redis - 程序开发中遇到的问题

最近要写一个类投票的系统:由于访问量可能会比较大,最好不直接使用mysql数据库,完全使用缓存的话,存在缓存失效等的风险,因此在mysql上面写个缓存中间过渡:1.memcache按照我的习惯,肯定是使用redis,但是公司目前这个项目线上还没有redis服务,只好

redis数据类型以及常用的命令一、Stringredis中没有使用C语言的字符串表示,而是自定义一个数据结构叫SDS(simple dynamic string)即简单动态字符串。打开下载的redis源码包,找到src下的sds.h文件查看sds源码:struct sdshdr {

//字符串长度

unsigned int len;

//buf数组中未使用的字节数量

unsigned int free;

//用于保存字符串

char buf[];};

c语言对字符串的存储是使用字符数组,遇到'\0'字符则认为字符串结束,redis的字符串可以存储任何类型的数据,因为任何类型数据都可以表示成二进制,sds结构中的char buf[]就是存储了二进制数据。

redis的字符串是二进制安全的,什么是二进制安全?简单理解就是存入什么数据取出的还是什么数据。redis中的sds不像c语言处理字符串那样遇到'\0'字符则认证字符串结束,它不会对存储进去的二进制数据进行处理,存入什么数据取出还是什么数据。1.1 赋值设值:

SET KEY VALUE

set test 123

对应的jedis操作

jedis.set(“”test,”123”);取值:GET KEYget test

返回"123"对应的jedis操作 jedis.get(“test”);当键不存在时,返回空结果。GETSET KEY VALUE 取值时,同时进行赋值操作,返回新赋的值1.2 删除DEL KEY

返回改变的键个数 Integer 1对应的jedis的操作jedis.del(“test”);1.3 数值增减返回的都是改变后的值incry key 数值每次递增1incryby key num 数值递增 numdecr key

数值递减1decrby key num 数值递减num1.4 尾部追加append key value 例如:set str hello

append str world

get str 返回的是helloworld1.5 获取字符串长度STRLEN KEY 返回的是键对应值的长度,如果键不存在,返回0 strlen str 1.6 同时设置多个键或获取多个键值设置多值:MSET KEY VALUE KEY1 VALUE1mset k1 v1 k2 v2 k3 v3获取多值:mget k1 k2 返回的是v1 v2二、Hash 散列类型2.1 使用String存在的问题 假设有User对象以JSON序列化的形式存储到Redis中,User对象有id,username、password、age、name等属性,存储的过程如下: 保存、更新: User对象 à json(string) à redis 如果在业务上只是更新age属性,其他的属性并不做更新我应该怎么做呢? 如果仍然采用上边的方法在传输、处理时会造成资源浪费,hash可以很好的解决这个问题。2.2 hash介绍hash叫散列类型,它提供了字段和字段值的映射。字段值只能是字符串类型,不支持散列类型、集合类型等其它类型。如下:

Map user = new HashMap();

user.put(“username”,”张三”);

user为键

username 为字段

zhangsan 为username 字段对应的字段值2.3 赋值HSET KEY FIELD VALUE 一次设置一个字段MHSET KEY FIELD1 VALUE1 F2 V2 一次设置多个自负案例如:hset user username zhangsanhmset user username zhangsan sex nan2.4 取值HGET KEY FIELD 一次取一个字段值HMGET KEY F1 F2 一次取多个字段值HGETALL KEY 返回所有的字段和值例如:hget user username 返回zhangsanhmget user username sex 返回 zhangsan

nanhgetall user 返回 username zhangsan

sex nan2.5 删除字段返回值是被删除的字段个数HDEL KEY F1 F2 可以删除一个字段,也可以删除多个字段例如:hdel user username sex2.6 增加数字 HINCRBY KEY FIELD NUM 例如:hset user age 12 hinctby user age 3

hget user age 返回14 如果需要减少数字,只需要将num变为负数即可。2.7 判断字段是否存在HEXISTs KEY FIELD返回1代表存在,返回0代表不存在例如:hexists user age 返回 1hexists user name 返回 0HSETNX KEY FIELD VALUE 当字段不存在时,执行添加操作,当字段存在时,不执行操作2.8 获取字段数量HLEN KEY2.9 只获取字段名或字段值HKEYS KEY 获取所有字段HVALS 获取所有字段的值例如:hkeys user 返回是username sex age hvals user 返回的是zhangsan nan 16三、List数据类型3.1 ArrayList与LinkedList的区别 redis中的List数据类型采用的是LinkedList类型。LinkedList与ArrayList的区别如下: ArrayList使用数组方式存储数据,所以根据索引查询数据速度快,而新增或者删除元素时需要设计到位移操作,所以比较慢。 LinkedList使用双向链接方式存储数据,每个元素都记录前后元素的指针,所以插入、删除数据时只是更改前后元素的指针指向即可,速度非常快,然后通过下标查询元素时需要从头开始索引,所以比较慢,但是如果查询前几个元素或后几个元素速度比较快。 3.2 redis中list的介绍

列表类型(list)可以存储一个有序的字符串列表,常用的操作是向列表两端添加元素,或者获得列表的某一个片段。

列表类型内部是使用双向链表(double linked list)实现的,所以向列表两端添加元素的时间复杂度为0(1),获取越接近两端的元素速度就越快。这意味着即使是一个有几千万个元素的列表,获取头部或尾部的10条记录也是极快的。3.3 添加元素LPUSH KEY V1 V2 向左边添加元素RPUSH KEY V1 V2 例如:lpush list 1 2 3rpush list 4 5 63.4 查看列表LRANGE KEY START STOP start 是开始索引 ,stop是结束索引,如果stop是负数,则表示从右边开始计算。左边索引从0开始,右边索引从-1开始lrange list 0 -1返回的是3 2 1 4 5 63.5 从列表两端弹出元素LPOP KEY 从左边弹出第一个元素 RPOP KEY 从右边弹出第一个元素弹出元素之后,该元素从列表中删除3.6 获取列表中元素的个数LEN KEY3.7 删除列表中指定的值LREM KEY COUNT VALUE删除列表中前count个值为value的元素。如果count大于0从左边开始删除,小于0从右边开始删除,等于0 删除所有值为value的元素3.8 获得/设置指定索引的元素值LINDEX KEY INDEX 获取指定索引的值LSET KEY INDEX VALUE 设置指定索引的值例如:lindex list 1 返回为2lset list 1 3 1索引处的值由2变为33.10 向列表中插入元素LINSERT KEY BEFORE|AFTER V1 V2首先会从左到右查找值为V1的元素,接着根据第二个参数 BEFORE或者AFTER来决定插入到该元素的前面还是后面。3.11 将元素从一个列表转移到另一个列表中RPOPLPUSH SOURCE TARGET将SOURCE列表的最右边的元素,添加到TARGET列表的左边四、SET 数据类型4.1 增加/删除元素SADD KEY V1 V2 增加key列表 v1 v2值SREM KEY V1 V2 移除V1 V2的值例如:sadd set1 1 2向set1集合中添加1 2srem set1 1 移除set1集合中的14.2 获取集合中的所有元素SMEMBERS KEY

获取集合中的所有元素SISMEMBER JEY V 判断某元素是否在该集合中,返回1为在,0表示不在。4.3 集合的差集运算 A-B属于A且不属于B的元素构成的集合SDIFF KEY1 KEYB例如:

sadd setA 1 2 3

sadd setB 2 3 4

sdiff setA setB 返回1

sdiss setB setaA 返回44.4 集合的交集运算属于A且属于B的元素构成的集合SINTER KEY1 KEY2例如: sinter setA setB 返回 2 34.5 集合的并集运算属于A或属于B的元素构成的集合SUNION KEY1 KEY2例如 sunion setA setB 返回 1 2 3 44.6 获取元素的个数SCARD KEY 4.7

从集合中弹出一个元素

SPOP KEY 由于set集合的无序性,每次随机弹出一个元素。五、sorted set数据类型5.1 sorted set集合介绍

在集合类型的基础上有序集合类型为集合中的每个元素都关联一个分数,这使得我们不仅可以完成插入、删除和判断元素是否存在在集合中,还能够获得分数最高或最低的前N个元素、获取指定分数范围内的元素等与分数有关的操作。 在某些方面有序集合和列表类型有些相似。 1、二者都是有序的。 2、二者都可以获得某一范围的元素。 但是,二者有着很大区别: 1、列表类型是通过链表实现的,获取靠近两端的数据速度极快,而当元素增多后,访问中间数据的速度会变慢。 2、有序集合类型使用散列表实现,所有即使读取位于中间部分的数据也很快。 3、列表中不能简单的调整某个元素的位置,但是有序集合可以(通过更改分数实现) 4、有序集合要比列表类型更耗内存。 5.2 增加元素zadd key score1 memeber1

s2 m2...向有序集合中加入一个元素和该元素的分数,如果该元素已经存在则会用新的分数替换原有的分数。返回值是新加入到集合中的元素个数,不包含之前已经存在的元素。例如:zadd score 80 zhangsan 90 lisi 75 wangwu 5.3 获取元素的分数zscore key memeber例如:zscore score zhangsan

返回805.4 删除元素zrem key member例如:zrem score zhangsan5.5 获得排名在某个范围的元素列表zrange key sart stop 按照分数从小到大顺序返回索引之间的元素,包含两端的元素例如;zrange score 0 2 返回 wangwu zhangsan

lisizrevrange key start stop按照分数从大到小的顺序,返回元素例如:zrevrange socre 0 2 返回 lisi zhangsan wangwu 如果需要获得元素的分数可以在命令尾部加上WITHSCORES参数例如: zrange score 0 1 WITHSCORES 返回:1) "zhangsan"2) "80"3) "wangwu"4) "94"5.6 增加某个元素的分数返回的额是更改后的分数 zincrby key num member 例如:zincrby score 5 zhangsan 返回 855.7 获得集合中元素的数量

zcard key 5.8 获得集合中指定分数范围内元素的个数zount key min max5.9 按照排名范围删除元素ZREMRANGEBYRANK key start stop5.10 按照分数范围删除元素ZREMRANGEBYSCORE key min max5.11获取元素的排名ZRANK key member 从小到大 ZREVRANK key member 从大到小5.12获得指定分数范围的元素ZRANGEBYSCORE key min max [WITHSCORES]例如: ZRANGEBYSCORE score 90 97 WITHSCORES 返回:

1) "lisi"

2) "90"ZRANGEBYSCORE score 70 100 limit 1 2 返回符合条件中的从元素1开始,两个元素1) "wangwu"2) "zhangsan" 六、KEY命令6.1 设置key的生存时间Redis在实际使用过程中更多的用作缓存,然而缓存的数据一般都是需要设置生存时间的,即:到期后数据销毁。 EXPIRE key seconds 设置key的生存时间(单位:秒)key在多少秒后会自动删除TTL key

查看key生于的生存时间PERSIST key

清除生存时间 PEXPIRE key milliseconds

相关推荐:Redis不同数据类型的的数据结构实现

我们知道Redis支持五种数据类型,分别是字符串、哈希表(map)、列表(list)、集合(set)和有序集合,和Java的集合框架类似,不同数据类型的数据结构实也是不一样的。>>Redis中的redisObject对象Redis是使用C编写的,内部实现了一个struct结构体redis

生存时间设置单位为:毫秒 例子:set test 1

设置test的值为1get test

获取test的值EXPIRE test 5

设置test的生存时间为5秒TTL test

查看test的生于生成时间还有1秒删除TTL test -2时,表示已经销毁get test

获取test的值,已经删除返回 (nil)6.2 keys pattern返回满足给定pattern 的所有key keys mylist* 返回1) "mylist"2) "mylist5"3) "mylist6"4) "mylist7"5) "mylist8"6.3 exists确认一个key 是否存在exists key 返回0表示不存在,返回1表示存在6.4 del删除一个key del key6.5

rename重命名key rename key newName6.6

type查看key的类型

这个方法可以非常简单的判断出值的类型七、

服务器命令7.1

ping测试连接是否存活,连接成功返回 pong,连接失败返回Could not connect to Redis at 127.0.0.1:6379: Connection refused7.2

echo在命令行打印一些内容例如: echo HongWan命令行会输出"HongWan"7.3

select选择数据库。Redis

数据库编号从0~15,我们可以选择任意一个数据库来进行数据的存取。 select 16

(error) ERR invalid DB index当选择16 时,报错,说明没有编号为16 的这个数据库7,4

quit退出连接, quit7.5 dbsize返回当前数据库中key 的数目。7.6

info获取服务器的信息和统计。例如: inforedis_version:2.2.12redis_git_sha1:00000000redis_git_dirty:0arch_bits:32multiplexing_api:epollprocess_id:28480uptime_in_seconds:2515uptime_in_days:07.7

flushdb删除当前选择数据库中的所有key。7.8

flushall删除所有数据库中的所有key。此方法慎用八、

数据持久化Redis的高性能是由于其将所有数据都存储在了内存中,为了使Redis在重启之后仍能保证数据不丢失,需要将数据从内存中同步到硬盘中,这一过程就是持久化。Redis支持两种方式的持久化,一种是RDB方式,一种是AOF方式。可以单独使用其中一种或将二者结合使用。8,1

RDB持久化

RDB方式的持久化是通过快照(snapshotting)完成的,当符合一定条件时Redis会自动将内存中的数据进行快照并持久化到硬盘。

RDB是Redis默认采用的持久化方式,在redis.conf配置文件中默认有此下配置:

save 900 1

save 300 10

save 60 10000

save 开头的一行就是持久化配置,可以配置多个条件(每行配置一个条件),每个条件之间是“或”的关系,“save 900 1”表示15分钟(900秒钟)内至少1个键被更改则进行快照,“save 300 10”表示5分钟(300秒)内至少10个键被更改则进行快照。在redis.conf中:

配置dir指定rdb快照文件的位置

配置dbfilenam指定rdb快照文件的名称

Redis启动后会读取RDB快照文件,将数据从硬盘载入到内存。根据数据量大小与结构和服务器性能不同,这个时间也不同。通常将记录一千万个字符串类型键、大小为1GB的快照文件载入到内存中需要花费20~30秒钟。

存在的问题:

通过RDB方式实现持久化,一旦Redis异常退出,就会丢失最后一次快照以后更改的所有数据。这就需要开发者根据具体的应用场合,通过组合设置自动快照条件的方式来将可能发生的数据损失控制在能够接受的范围。如果数据很重要以至于无法承受任何损失,则可以考虑使用AOF方式进行持久化。8.2

AOF持久化

默认情况下Redis没有开启AOF(append only file)方式的持久化,可以通过appendonly参数开启:appendonly yes开启AOF持久化后每执行一条会更改Redis中的数据的命令,Redis就会将该命令写入硬盘中的AOF文件。AOF文件的保存位置和RDB文件的位置相同,都是通过dir参数设置的,默认的文件名是appendonly.aof,可以通过appendfilename参数修改:appendfilename appendonly.aof九、

redis.conf 配置文件Redis 支持很多的参数,但都有默认值。1 、daemonize: 默认情况下,redis 不是在后台运行的,如果需要在后台运行,把该项的值更改为yes2、pidfile 当Redis 在后台运行的时候,Redis 默认会把pid 文件放在/var/run/redis.pid,你可以配 置到其他地址。当运行多个redis 服务时,需要指定不同的pid 文件和端口3、 bind 指定Redis 只接收来自于该IP 地址的请求,如果不进行设置,那么将处理所有请求,在 生产环境中最好设置该项4、port 监听端口,默认为63795、timeout 设置客户端连接时的超时时间,单位为秒。当客户端在这段时间内没有发出任何指令, 那么关闭该连接6、loglevel log 等级分为4 级,debug, verbose, notice, 和warning。生产环境下一般开启notice7、logfile 配置log 文件地址,默认使用标准输出,即打印在命令行终端的窗口上8、databases 设置数据库的个数,可以使用SELECT 命令来切换数据库。默认使用的数据库是09、 save 设置Redis 进行数据库镜像的频率。 if(在60 秒之内有10000 个keys 发生变化时){ 进行镜像备份 }else if(在300 秒之内有10 个keys 发生了变化){ 进行镜像备份 }else if(在900 秒之内有1 个keys 发生了变化){ 进行镜像备份 }10、rdbcompression 在进行镜像备份时,是否进行压缩11、dbfilename 镜像备份文件的文件名12、dir 数据库镜像备份的文件放置的路径。这里的路径跟文件名要分开配置是因为Redis 在进 行备份时,先会将当前数据库的状态写入到一个临时文件中,等备份完成时,再把该该 临时文件替换为上面所指定的文件,而这里的临时文件和上面所配置的备份文件都会放 在这个指定的路径当中13、slaveof 设置该数据库为其他数据库的从数据库14、masterauth 当主数据库连接需要密码验证时,在这里指定15、requirepass 设置客户端连接后进行任何其他指定前需要使用的密码。警告:因为redis 速度相当快, 所以在一台比较好的服务器下,一个外部的用户可以在一秒钟进行150K 次的密码尝试, 这意味着你需要指定非常非常强大的密码来防止暴力破解。16、maxclients 限制同时连接的客户数量。当连接数超过这个值时,redis 将不再接收其他连接请求, 客户端尝试连接时将收到error 信息。17、maxmemory 设置redis 能够使用的最大内存。当内存满了的时候,如果还接收到set 命令,redis 将 先尝试剔除设置过expire 信息的key,而不管该key 的过期时间还没有到达。在删除时, 将按照过期时间进行删除,最早将要被过期的key 将最先被删除。如果带有expire 信息 的key 都删光了,那么将返回错误。这样,redis 将不再接收写请求,只接收get 请求。 maxmemory 的设置比较适合于把redis 当作于类似memcached 的缓存来使用。18、appendonly 默认情况下,redis 会在后台异步的把数据库镜像备份到磁盘,但是该备份是非常耗时 的,而且备份也不能很频繁,如果发生诸如拉闸限电、拔插头等状况,那么将造成比较 大范围的数据丢失。所以redis 提供了另外一种更加高效的数据库备份及灾难恢复方式。 开启append only 模式之后,redis 会把所接收到的每一次写操作请求都追加到 appendonly.aof 文件中,当redis 重新启动时,会从该文件恢复出之前的状态。但是这样 会造成appendonly.aof 文件过大,所以redis 还支持了BGREWRITEAOF 指令,对 appendonly.aof 进行重新整理。所以我认为推荐生产环境下的做法为关闭镜像,开启 appendonly.aof,同时可以选择在访问较少的时间每天对appendonly.aof 进行重写一次。19、appendfsync 设置对appendonly.aof 文件进行同步的频率。always 表示每次有写操作都进行同步, everysec 表示对写操作进行累积,每秒同步一次。这个需要根据实际业务场景进行配置20、vm-enabled 是否开启虚拟内存支持。因为redis 是一个内存数据库,而且当内存满的时候,无法接 收新的写请求,所以在redis 2.0 中,提供了虚拟内存的支持。但是需要注意的是,redis 中,所有的key 都会放在内存中,在内存不够时,只会把value 值放入交换区。这样保 证了虽然使用虚拟内存,但性能基本不受影响,同时,你需要注意的是你要把 vm-max-memory 设置到足够来放下你的所有的key21、 vm-swap-file 设置虚拟内存的交换文件路径22、 vm-max-memory 这里设置开启虚拟内存之后,redis 将使用的最大物理内存的大小。默认为0,redis 将 把他所有的能放到交换文件的都放到交换文件中,以尽量少的使用物理内存。在生产环 境下,需要根据实际情况设置该值,最好不要使用默认的0 23、vm-page-size 设置虚拟内存的页大小,如果你的value 值比较大,比如说你要在value 中放置博客、 新闻之类的所有文章内容,就设大一点,如果要放置的都是很小的内容,那就设小一点。24、vm-pages 设置交换文件的总的page 数量,需要注意的是,page table 信息会放在物理内存中,每 8 个page 就会占据RAM 中的1 个byte。总的虚拟内存大小 = vm-page-size * vm-pages25、vm-max-threads 设置VM IO 同时使用的线程数量。因为在进行内存交换时,对数据有编码和解码的过 程,所以尽管IO 设备在硬件上本上不能支持很多的并发读写,但是还是如果你所保存 的vlaue 值比较大,将该值设大一些,还是能够提升性能的26、glueoutputbuf 把小的输出缓存放在一起,以便能够在一个TCP packet 中为客户端发送多个响应,具体 原理和真实效果我不是很清楚。所以根据注释,你不是很确定的时候就设置成yes27、hash-max-zipmap-entries 在redis 2.0 中引入了hash 数据结构。当hash 中包含超过指定元素个数并且最大的元素 没有超过临界时,hash 将以一种特殊的编码方式(大大减少内存使用)来存储,这里 可以设置这两个临界值28、activerehashing 开启之后,redis 将在每100 毫秒时使用1 毫秒的CPU 时间来对redis 的hash 表进行重 新hash,可以降低内存的使用。当你的使用场景中,有非常严格的实时性需要,不能 够接受Redis 时不时的对请求有2 毫秒的延迟的话,把这项配置为no。如果没有这么严 格的实时性要求,可以设置为yes,以便能够尽可能快的释放内存

$(function () {

$('pre.prettyprint code').each(function () {

var lines = $(this).text().split('\n').length;

var $numbering = $('<ul/>').addClass('pre-numbering').hide();

$(this).addClass('has-numbering').parent().append($numbering);

for (i = 1; i <= lines; i++) {

$numbering.append($('<li/>').text(i));

};

$numbering.fadeIn(1700);

});

});

相关推荐:redis快速入门-数据类型

前言最近因项目需要用到redis,所以借助《Redis入门指南》(李子骅 编著)这本书快速入门了一下,此处记录下一些知识点(主要是命令),方便以后查阅。简介Redis是一个开源的key-value存储,并用于构建高性能,可扩展的Web应用程序的完美解决方案。

redis数据类型以及常用的命令一、Stringredis中没有使用C语言的字符串表示,而是自定义一个数据结构叫SDS(simple dynamic string)即简单动态字符串。打开下载的redis源码包,找到src下...

------分隔线----------------------------