Redis

wget http://download.redis.io/releases/redis-2.8.17.tar.gz
tar xzf redis-2.8.17.tar.gz
cd redis-2.8.17
make
make完后 redis-2.8.17目录下会出现编译后的redis服务程序redis-server,还有用于测试的客户端程序redis-cli,两个程序位于安装目录 src 目录下:

下面启动redis服务.

cd /redis/src

  • ./redis-server (&)
    注意这种方式启动redis 使用的是默认配置。也可以通过启动参数告诉redis使用指定配置文件使用下面命令启动。加上&是让redis以后台方式 运行

  • ./redis-server ../redis.conf
    redis.conf 是一个默认的配置文件。我们可以根据需要使用自己的配置文件。

  • redis-cli -p 6380
    使用redis-cli登录,-p指定端口

启动redis服务进程后,就可以使用测试客户端程序redis-cli和redis服务交互了。 比如:

cd src
./redis-cli
redis> set foo bar
OK
redis> get foo
"bar"

Redis支持String,list,set,hash,zset五种数据类型

string

string是Redi最基础的数据结构,首先,键都是string类型的,而且其他数据都是在string的基础上构建的。string可以是字符串(简单的字符串、复杂的字符串(例如JSON、XML))、数字(整数、浮点数),甚至是二进制(图片、音频、视频),,但是大小不能超过512MB。
image.png

常用命令:

设置值

set key value [ex seconds] [px milliseconds] [nx|xx]

set命令有几个选项:
·ex seconds:为键设置秒级过期时间。
·px milliseconds:为键设置毫秒级过期时间。
·nx:键必须不存在,才可以设置成功,用于添加。
·xx:与nx相反,键必须存在,才可以设置成功,用于更新。
除了set选项,Redis还提供了setex和setnx两个命令:

除了set选项,Redis还提供了setex和setnx两个命令:
setex key [seconds] value
setnx key value
setnx和setxx在实际使用中有什么应用场景吗?以setnx命令为例子,由于Redis的单线程命令处理机制,如果有多个客户端同时执行setnx key value,根据setnx的特性只有一个客户端能设置成功,setnx可以作为分布式锁的一种实现方案,Redis官方给出了使用setnx实现分布式锁的方法:http://redis.io/topics/distlock。

获取值:

get key
image.png

批量设置值:

mset key value [key value ...]
image.png

批量获取值:

mget key [key,key....]
image.png
image.png

用mget命令后,要执行n次get命令操作只需要按照图2-9的方式来完成,具体耗时如下:
n次get时间 = 1次网络时间 + n次命令时间


image.png

Redis可以支撑每秒数万的读写操作,但是这指的是Redis服务端的处理能力,对于客户端来说,一次命令除了命令时间还是有网络时间,假设网络时间为1毫秒,命令时间为0.1毫秒(按照每秒处理1万条命令算),那么执行1000次get命令和1次mget命令的区别如表2-1,因为Redis的处理能力已经足够高,对于开发人员来说,网络可能会成为性能的瓶颈。

学会使用批量操作,有助于提高业务处理效率,但是要注意的是每次批量操作所发送的命令数不是无节制的,如果数量过多可能造成Redis阻塞或者网络拥塞。
image.png
image.png

计数

incr key
incr命令用于对值做自增操作,返回结果分为三种情况:

  • 值不是整数,返回错误。
  • 值是整数,返回自增后的结果。
  • 键不存在,按照值为0自增,返回结果为1。

例如对一个不存在的键执行incr操作后,返回结果是1:


image.png

除了incr命令,Redis提供了decr(自减)、incrby(自增指定数字)、decrby(自减指定数字)、incrbyfloat(自增浮点数):

  • decr key
  • incrby key increment
  • decrby key decrement
  • incrbyfloat key increment
image.png

image.png

不常用命令:
append key val --在字符串尾部追加字符串
strlen key --字符串的长度
getset key value -- 设置并返回原来的值
setrange key offeset value 设置指定位置的字符
getrange key start end 获取部分字符串


image.png

字符串内部编码

字符串类型的内部编码有3种:

  • ThreadLocalint:8个字节的长整型。
  • embstr:小于等于39个字节的字符串。
  • raw:大于39个字节的字符串。

hash

在Redis中,哈希类型是指键值本身又是一个键值对结构,形如value={{field1,value1},...{fieldN,valueN}}

哈希类型中的映射关系叫作field-value,注意这里的value是指field对应的值,不是键对应的值,请注意value在不同上下文的作用。
hset key filed value --设置值


image.png
image.png

list

列表(list)类型是用来存储多个有序的字符串,如图2-18所示,a、b、c、d、e五个元素从左到右组成了一个有序的列表,列表中的每个字符串称为元素(element),一个列表最多可以存储232-1个元素。在Redis中,可以对列表两端插入(push)和弹出(pop),还可以获取指定范围的元素列表、获取指定索引下标的元素等(如图2-18和图2-19所示)。列表是一种比较灵活的数据结构,它可以充当栈和队列的角色,在实际开发上有很多应用场景。


image.png

列表类型有两个特点:第一、列表中的元素是有序的,这就意味着可以通过索引下标获取某个元素或者某个范围内的元素列表,例如要获取图2-19的第5个元素,可以执行lindex user:1:message4(索引从0算起)就可以得到元素e。第二、列表中的元素可以是重复的,例如图2-20所示列表中包含了两个字符串a。
image.png

命令

image.png

rpush key value [value ...]
lpush key value [value ...]
linsert key before|after pivot value
lindex key index 获取列表指定索引下标的元素
lrange key start end 获取指定范围内的元素列表
lrange key 0 -1 可以从左到右获取列表的所有元素
(第一,索引下标从左到右分别是0到N-1,但是从右到左分别是-1到-N。
第二,lrange中的end选项包含了自身,这个和很多编程语言不包含end不太
相同,例如想获取列表的第2到第4个元素)

删除数据
lpop key
rpop key
lrem key count value

ltrim key start end
下面操作会只保留列表listkey第2个到第4个元素:
127.0.0.1:6379> ltrim listkey 1 3
OK

lset key index newValue 修改指定索引下标的元素

blpop key [key ...] timeout
brpop key [key ...] timeout

blpop和brpop是lpop和rpop的阻塞版本,它们除了弹出方向不同,使用方法基本相同,所以下面以brpop命令进行说明,brpop命令包含两个参数:
·key[key...]:多个列表的键。
·timeout:阻塞时间(单位:秒)。

image.png
image.png

Set

image.png

image.png

集合类型的内部编码有两种:
·intset(整数集合):当集合中的元素都是整数且元素个数小于set-maxintset-entries配置(默认512个)时,Redis会选用intset来作为集合的内部实现,从而减少内存的使用。
·hashtable(哈希表):当集合类型无法满足intset的条件时,Redis会使用hashtable作为集合的内部实现。

集合类型比较典型的使用场景是标签(tag)

二、持久化

redis支持RDB与AOF两种持久化机制,持久化公共能有效的避免因进程退出造成的数据丢失问题。

1.RDB

DB持久化是把当前进程数据生成快照保存到硬盘的过程。触发RDB持久化分为手动触发自动触发

  • 手动触发
    .sava命令:阻塞Redis服务器,直到RDB过程完成
    .bgsave: Redis进程执行fork操作创建子进程,RDB持久化由子进程负责。完成后自动结束,阻塞只在fork阶段。
  • 自动触发

1.使用save相关配置,如save m n,表示m秒内数据集存在n次修改是自动触发bsave
2.如果从节点执行全量复制操作,主节点自动执行bgsave生成RDB文件,并发送给从节点。
3.执行debug reload命令重新加载Redis时,也会自动触发save操作
4.默认情况下执行shutdown命令时,如果没有开启AOF持久化功能则自动执行bgsave。

2.RDB流程

bgsave是主流的触发RDB持久化方式


image.png

你可能感兴趣的:(Redis)