您的位置:首页 > 数据库 > Redis

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

2016-08-05 18:18 876 查看

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

一、String

redis中没有使用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 KEY
get test  返回"123"
对应的jedis操作 jedis.get(“test”);当键不存在时,返回空结果。
GETSET KEY VALUE 取值时,同时进行赋值操作,返回新赋的值


1.2 删除

DEL KEY  返回改变的键个数 Integer 1
对应的jedis的操作
jedis.del(“test”);


1.3 数值增减

返回的都是改变后的值
incry key 数值每次递增1
incryby key num 数值递增 num
decr key  数值递减1
decrby key num 数值递减num


1.4 尾部追加

append key value
例如:set str hello
append str world
get str 返回的是helloworld


1.5 获取字符串长度

STRLEN KEY 返回的是键对应值的长度,如果键不存在,返回0
strlen str


1.6 同时设置多个键或获取多个键值

设置多值:
MSET KEY VALUE KEY1 VALUE1
mset 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 zhangsan
hmset user username zhangsan sex nan


2.4 取值

HGET KEY FIELD 一次取一个字段值
HMGET KEY F1 F2 一次取多个字段值
HGETALL KEY 返回所有的字段和值
例如:hget user username 返回zhangsan
hmget user username sex 返回 zhangsan  nan
hgetall user 返回 username zhangsan  sex nan


2.5 删除字段

返回值是被删除的字段个数
HDEL KEY F1 F2 可以删除一个字段,也可以删除多个字段
例如:hdel user username sex


2.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 返回 1
hexists user name 返回 0

HSETNX KEY FIELD VALUE 当字段不存在时,执行添加操作,当字段存在时,不执行操作


2.8 获取字段数量

HLEN KEY


2.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 3
rpush list 4 5 6


3.4 查看列表

LRANGE KEY START STOP
start 是开始索引 ,stop是结束索引,如果stop是负数,则表示从右边开始计算。左边索引从0开始,右边索引从-1开始
lrange list 0 -1
返回的是3 2 1 4 5 6


3.5 从列表两端弹出元素

LPOP KEY 从左边弹出第一个元素
RPOP KEY 从右边弹出第一个元素
弹出元素之后,该元素从列表中删除


3.6 获取列表中元素的个数

LEN KEY


3.7 删除列表中指定的值

LREM KEY COUNT VALUE
删除列表中前count个值为value的元素。如果count大于0从左边开始删除,小于0从右边开始删除,等于0 删除所有值为value的元素


3.8 获得/设置指定索引的元素值

LINDEX KEY INDEX 获取指定索引的值
LSET KEY INDEX VALUE 设置指定索引的值
例如:lindex list 1 返回为2
lset list 1 3 1索引处的值由2变为3


3.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 2
srem set1 1 移除set1集合中的1


4.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 返回4


4.4 集合的交集运算

属于A且属于B的元素构成的集合
SINTER KEY1 KEY2
例如:
sinter setA setB 返回 2 3


4.5 集合的并集运算

属于A或属于B的元素构成的集合
SUNION KEY1 KEY2
例如
sunion setA setB 返回 1 2 3 4


4.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  返回80


5.4 删除元素

zrem key member
例如:zrem score zhangsan


5.5 获得排名在某个范围的元素列表

zrange key sart stop 按照分数从小到大顺序返回索引之间的元素,包含两端的元素
例如;zrange score 0 2 返回 wangwu zhangsan  lisi

zrevrange 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 返回 85


5.7 获得集合中元素的数量

zcard key


5.8 获得集合中指定分数范围内元素的个数

zount key min max


5.9 按照排名范围删除元素

ZREMRANGEBYRANK key start stop


5.10 按照分数范围删除元素

ZREMRANGEBYSCORE key min max


5.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    生存时间设置单位为:毫秒
例子:
set test 1      设置test的值为1
get 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 key


6.5 rename

重命名key rename key newName


6.6 type

查看key的类型
这个方法可以非常简单的判断出值的类型


七、 服务器命令

7.1 ping

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


7.2 echo

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


7.3 select

选择数据库。Redis     数据库编号从0~15,我们可以选择任意一个数据库来进行数据的存取。
select 16         (error) ERR invalid DB index
当选择16 时,报错,说明没有编号为16 的这个数据库


7,4 quit

退出连接, quit


7.5 dbsize

返回当前数据库中key 的数目。


7.6 info

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


7.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 不是在后台运行的,如果需要在后台运行,把该项的值更改为yes

2、pidfile

当Redis 在后台运行的时候,Redis 默认会把pid 文件放在/var/run/redis.pid,你可以配

置到其他地址。当运行多个redis 服务时,需要指定不同的pid 文件和端口

3、 bind

指定Redis 只接收来自于该IP 地址的请求,如果不进行设置,那么将处理所有请求,在

生产环境中最好设置该项

4、port

监听端口,默认为6379

5、timeout

设置客户端连接时的超时时间,单位为秒。当客户端在这段时间内没有发出任何指令,

那么关闭该连接

6、loglevel

log 等级分为4 级,debug, verbose, notice, 和warning。生产环境下一般开启notice

7、logfile

配置log 文件地址,默认使用标准输出,即打印在命令行终端的窗口上

8、databases

设置数据库的个数,可以使用SELECT 命令来切换数据库。默认使用的数据库是0

9、 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 设置到足够来放下你的所有的key

21、 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-pages

25、vm-max-threads

设置VM IO 同时使用的线程数量。因为在进行内存交换时,对数据有编码和解码的过

程,所以尽管IO 设备在硬件上本上不能支持很多的并发读写,但是还是如果你所保存

的vlaue 值比较大,将该值设大一些,还是能够提升性能的

26、glueoutputbuf

把小的输出缓存放在一起,以便能够在一个TCP packet 中为客户端发送多个响应,具体

原理和真实效果我不是很清楚。所以根据注释,你不是很确定的时候就设置成yes

27、hash-max-zipmap-entries

在redis 2.0 中引入了hash 数据结构。当hash 中包含超过指定元素个数并且最大的元素

没有超过临界时,hash 将以一种特殊的编码方式(大大减少内存使用)来存储,这里

可以设置这两个临界值

28、activerehashing

开启之后,redis 将在每100 毫秒时使用1 毫秒的CPU 时间来对redis 的hash 表进行重

新hash,可以降低内存的使用。当你的使用场景中,有非常严格的实时性需要,不能

够接受Redis 时不时的对请求有2 毫秒的延迟的话,把这项配置为no。如果没有这么严

格的实时性要求,可以设置为yes,以便能够尽可能快的释放内存
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: