一,Redis介绍

内存数据库

redis 分词搜索 redis分析_Redis

Redis特点:

  • 开源的(BSD协议),使用ANSI  C 编写,基于内存的且支持持久化,高性能的Key-Value的NoSQL数据库
  • 单线程运行,省去了线程上下文切换带来的性能开销,效率更高。
  • 支持数据结构类型丰富,有字符串(strings),散列(hashes),列表(lists),集合(sets), 有序集合(sorted sets),位图(bitmaps),hyperloglogs和地理空间(geospatial)索引半径查询。
  • 支持众多主流语言的客户端,C、C++、Python、Erlang、R、C#、Java、PHP、Objective-C、Perl、Ruby、Scala、Go、JavaScript

用途:

        缓存,数据库,消息中间件

官方网站:

        Redis

中文:

        redis中文官方网站

二,Redis数据结构

redis 分词搜索 redis分析_字符串_02

redis的key

        Redis key 值是二进制安全的,这意味着可以用任何二进制序列作为key值,从形如“foo”的简单字符串到一个JPEG文件的内容都可以。空字符串也是有效key值

Key取值原则

  1. 键值不需要太长,消耗内存,且在数据中查找这类键值的计算成本较高
  2. 键值不宜过短,可读性较差

登录redis获取帮助

redis 分词搜索 redis分析_字段_03

三, redis的string操作

一种最基本的Redis值类型(字节数组)。

Redis字符串是二进制安全的,一个Redis字符串能包含任意类型的数据。例如: 一张JPEG格式的图片或者一个序列化的Ruby对象。一个字符串类型的值最多能存储512M字节的内容

key : string

value: string

设置字符串值

  set  get

SET key   value [EX seconds] [PX milliseconds] [NX|XX]

EX 设置过期时间,秒,等同于SETEX key seconds value

set hello world ex 10

PX 设置过期时间,毫秒,等同于PSETEX key milliseconds value

set hello world px 5000

NX 键不存在,才能设置,等同于SETNX key value

set hello bjsxt nx

XX 键存在时,才能设置

set hello sxt xx

设置多个键的字符串值

MSET key value [key value ...]

mset keya valuea keyb valueb keyc valuec keyd valud

键不存在时,设置字符串值

MSETNX key value [key value ...]

msetnx a valua b valueb c valuec

注意是原子操作,对多个kv,要不成功都不成功

flushdb 删除当前数据库的所有数据

flushall 删除所有数据库的所有数据

Redis中可以给Key设置一个生存时间(秒或毫秒),当达到这个时长后,这些键值将会被自动删除

设置多少秒或者毫秒后过期

EXPIRE key seconds

expire a 3

set key val  ex 10或者

setex  key   time(s)   value

setex okok 5  myok

PEXPIRE key milliseconds

pexpire b 3567

设置在指定Unix时间戳过期

EXPIREAT key timestamp

expireat  c

expireat keyc 1569465525

PEXPIREAT key milliseconds-timestamp

System.currentTimeMills

删除过期

PERSIST key

persist c

Time To Live,Key的剩余生存时间

查看剩余生存时间

        TTL key

ttl c

        PTTL key  查看毫秒值

key存在但没有设置TTL,返回-1

key存在,但还在生存期内,返回剩余的秒或者毫秒

key曾经存在,但已经消亡,返回-2(2.8版本之前返回-1)

查找键

  KEYS pattern

pattern取值

* 任意长度字符

keys ?e*

? 任意一个字符

keys ?e??

[] 字符集合,表示可以是集合中的任意一个

keys key[ab]

键是否存在

EXISTS key

exists keya

键重命名

RENAME key newkey

rename keya keyb  直接重命名,有可能覆盖值

RENAMENX key newkey

renamenx keyb hello  新的名字不存在的时候再重命名

键删除

DEL key [key ...]

同时删除两个key

del world hello

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

    int:8个字节的长整型。

    embstr:小于等于39个字节的字符串。

    raw大于39个字节的字符串。

Redis会根据当前值的类型和长度决定使用哪种内部编码实现。

获取值

GET key

获取多个给定的键的值

MGET key [key ...]

mget keyb keyd

返回旧值并设置新值

          GETSET key value

如果键不存在,就创建并赋值

字符串长度

STRLEN key

          object encoding key   获取value底层存储的数据结构类型

键类型

TYPE key

追加字符串

            APPEND key value

如果键存在就追加;如果不存在就等同于SET key value

获取子字符串   索引

            GETRANGE key start end

            0 3        0   -1(获取所有的内容)

从字符串右边向左数起,

-1表示最右一个字符,负号减轻复杂度

set myhello 0123456789

getrange myhello 3 8

getrange myhello 3 -1

getrange myhello 3 -2

覆盖字符串

    SETRANGE key offset value

setrange myhello 4 x

setrange myhello 4 ABC

setrange myhello 4 XYZRSTUV

步长1的增减

            INCR key

            DECR key

string类型的,底层实现是int,实际上操作的还是数字。

字符串值会被解释成64位有符号的十进制整数来操作,结果依然转成字符串

步长增减

INCRBY key decrement

incrby A 10

DECRBY key decrement  

操作浮点数

incrbyfloat mynum -0.5

字符串值会被解释成64位有符号的十进制整数来操作,结果依然转成字符串

三,Redis的位图bitmap【字节数组】

redis 分词搜索 redis分析_redis 分词搜索_04

位图不是真正的数据类型,它是定义在字符串类型中

一个字符串类型的值最多能存储512M字节的内容

位上限:2^(9(512)+10(1024)+10(1024)+3(8b=1B))=2^32b

设置某一位上的值

     SETBIT key offset value   (0/1)

     offset位偏移量,从0开始

setbit mybit 2 1

获取某一位上的值

GETBIT key offset

getbit mybit 5

返回指定值0或者1在指定区间上第一次出现的位置偏移量

[start]  [end](字节索引,0表示第一个字节) 

 位操作

BITOP AND destkey key [key ...] ,对一个或多个 key 求逻与,并将结果保存到 destkey

bitop and mybitresult mybit1  mybit2

BITOP OR destkey key [key ...] ,对一个或多个 key 求逻辑或,并将结果保存到 destkey

BITOP XOR destkey key [key ...] ,对一个或多个 key 求逻辑异或,并将结果保存到 destkey

BITOP NOT destkey key ,对给定 key 求逻辑非,并将结果保存到 destkey

四,Redis的list

redis 分词搜索 redis分析_字符串_05

  • 基于Linked List实现,双向无环链表
  • 元素是字符串类型
  • 列表头尾增删快,中间增删慢,增删元素是常态
  • 元素可以重复出现
  • 最多包含2^32-1元素

redis 分词搜索 redis分析_Redis_06

list:

  1. 队列:L/R  R/L
  2. 栈: L/L   R/R
  3. 数组:LINDEX LSET
  4. 阻塞:BL BR

命令说明

B block 块,阻塞

L left 左

R right 右

X exist 存在

左右或者头尾压入元素  string   set key “abc”

LPUSH

LPUSHX

RPUSH

RPUSHX

左右或者头尾弹出元素

LPOP

RPOP

从一个列表尾部弹出元素压入到另一个列表的头部  string   getset

RPOPLPUSH

返回列表中指定范围元素

LRANGE

LRANGE

获取指定位置的元素

LINDEX

设置指定位置元素的值

LSET

列表长度,元素个数   string    strlen

LLEN

redis 分词搜索 redis分析_redis 分词搜索_07

从列表头部开始删除值等于value的元素count次,LIST 可以重复出现

LREM

count > 0 : 从表头开始向表尾搜索,移除与 value 相等的元素,数量为 count

count < 0 : 从表尾开始向表头搜索,移除与 value 相等的元素,数量为 count 的绝对值

count = 0 : 移除表中所有与 value 相等的值

阻塞

如果弹出的列表不存在或者为空,就会阻塞

超时时间设置为0,就是永久阻塞,直到有数据可以弹出

如果多个客户端阻塞在同一个列表上,使用First In First Service原则,先到先服务

左右或者头尾阻塞弹出元素

BLPOP

BRPOP

从一个列表尾部阻塞弹出元素压入到另一个列表的头部

         BRPOPLPUSH source destination timeout

五,redis的hash散列

redis 分词搜索 redis分析_redis 分词搜索_08

  1. 由field和关联的value组成的map键值对
  2. field和value是字符串类型
  3. 一个hash中最多包含2^32-1键值对

设置单个字段

HSET key field value

HSETNX key field value

                  key的filed不存在的情况下执行,key不存在直接创建

设置多个字段

HMSET key field value [field value ...]

返回字段个数

HLEN key

判断字段是否存在

HEXISTS key field

         key或者field不存在,返回0

返回字段值

HGET key field

返回多个字段值

HMGET key field [field ...]

返回所有的键值对

HGETALL key

返回所有字段名

HKEYS key

返回所有值

HVALS key

在字段对应的值上进行整数的增量计算

HINCRBY key field increment

在字段对应的值上进行浮点数的增量计算

HINCRBYFLOAT key field increment

删除指定的字段

HDEL key field [field ...]

六,Redis的set集合

无序的、去重的

元素是字符串类型

最多包含2^32-1元素

增加一个或多个元素

SADD key member [member ...]

          如果元素已经存在,则自动忽略

移除一个或者多个元素

SREM key member [member ...]

          元素不存在,自动忽略

集合的无序性

         SADD friendsnew "peter" "jack" "tom" "john" "may" "ben"

         SADD anotherfriends "peter" "jack" "tom" "john" "may" "ben"

         SMEMBERS friendsnew

         SMEMBERS anotherfriends

          注意, SMEMBERS 有可能返回不同的结果,所以,如果需要存储有序且不重复的数据使用有序集合,存储有序可重复的使用列表

七,Redis的SortedSet集合

  1. 类似Set集合
  2. 有序的、去重的
  3. 元素是字符串类型
  4. 每一个元素都关联着一个浮点数分值(Score),并按照分值从小到大的顺序排列集合中的元素。分值可以相同
  5. 最多包含2^32-1元素

增加一个或多个元素

ZADD key score member [score member ...]

         如果元素已经存在,则使用新的score值

移除一个或者多个元素

ZREM key member [member ...]

         元素不存在,自动忽略

显示分值

ZSCORE key member

增加或者减少分值 浮点值

ZINCRBY key increment member

         increment为负数就是减少

返回元素的排名(索引)

ZRANK key member

返回元素的逆序排名

首先按照分值从大到小排列,然后再看索引。

ZREVRANK key member

返回指定索引区间元素

start和stop是按照排名来分割的。

ZRANGE key start stop [WITHSCORES]