【新闻推荐系统】(task2)Redis篇(上)

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库。由于是内存数据库,读写非常高速,可达10w/s的评率,所以一般应用于数据变化快、实时通讯、缓存等。但内存数据库通常要考虑机器的内存大小。Redis 是完全开源免费的,遵守 BSD 协议,是一个灵活的高性能 key-value 数据结构存储,可以用来作为数据库、缓存和消息队列。相比于其他的 key-value 缓存产品有以下三个特点:

一、redis简介:

1.0 redis特点

Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库。由于是内存数据库,读写非常高速,可达10w/s的评率,所以一般应用于数据变化快、实时通讯、缓存等。但内存数据库通常要考虑机器的内存大小。Redis 是完全开源免费的,遵守 BSD 协议,是一个灵活的高性能 key-value 数据结构存储,可以用来作为数据库、缓存和消息队列。相比于其他的 key-value 缓存产品有以下三个特点:

Redis 支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载到内存使用。

Redis 不仅支持简单的 key-value 类型的数据,同时还提供 list,set,zset,hash 等数据结构的存储。

Redis 支持主从复制,即 master-slave 模式的数据备份。

Redis 是当今业界最主流的内存数据库。

(1)所有的数据都以 Key-value 的形式存储。

Key 只能是字符串,value 可支持的数据结构包括 string(字符串)、list(链表)、set(集合)、zset(有序集合) 和 hash(哈希)。这个特点决定了 Redis 的使用方式,无论是存储还是获取,都应该以键值对的形式进行,并且根据你的数据特点,设计值的数据结构。

(2)所有的数据都存储在内存中

磁盘只在持久化备份或恢复数据时起作用。

这个特点决定了 Redis 的特性:一是 QPS 峰值可以很高,二是数据易丢失,所以我们在维护 Redis 时要充分考虑数据的备份问题,或者说,不应该把关键的业务数据唯一地放到 Redis 中。但对于可恢复,不关乎关键业务逻辑的推荐特征数据,就非常适合利用 Redis 提供高效的存储和查询服务。

QPS:每秒查询率QPS是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准,在因特网上,作为域名系统服务器的机器的性能经常用每秒查询率来衡量。

1.1 安装:

本项目是基于Ubuntu环境进行开发,因此接下来都以Ubuntu的环境为基础,对于其他开发环境,大家可以参考相关的资料进行学习。

(1)安装Redis服务器:

sudo apt-get install redis-server

下载完成的结果

image.png

(2)启动Redis服务:、

一般来说,当安装完成后,Redis服务器会自动启动,可以通过以下命令检查是否启动成功。(ps:如果Active显示为 active(running) 状态:表示redis已在运行,启动成功)

service redis-server status

image.png

检查当前进程,查看redis是否启动。(ps: 可以看到redis服务正在监听6379端口)

ps -aux|grep redis-server

image.png

或者进入redis客户端,与服务器进行通信,当输入ping命令,如果返回 PONG 表示Redis已成功安装。

redis-cli

image.png

上面的127.0.0.1 是redis服务器的 IP 地址,6379 是 Redis 服务器运行的端口。

1.2 命令:

下面简单介绍一些常用的Redis命令:

1、基本操作命令:

(1)启动Redis

redis-server [--daemonize yes][--port 6379]

可以通过带参数方式来启动,如果参数过多,可以使用/etc/redis/redis.conf下面的配置文件来启动Redis。

redis-server /etc/redis/redis.conf

(2)连接Redis

redis-cli [-h host -p port -a password]

其中上面参数默认的是redis-server的默认地址和端口号,password可以在服务启动时采用参数的方式或者配置文件方式都可进行设置。因此可以通过redis-cli,可以连上我们服务器端的redis服务。

(3)停止Redis

停止Redis有两种方法,一种是通过 redis-cli 停止,另一种是通过杀掉redis服务进程

> redis-cli shutdown
> kill redis-pid

(4)切换库指令

redis.conf配置中默认16个库,下标从0~15。进入客服端默认选中第0个库,可以通过select命令进行切换,index表示库的小标。

127.0.0.1:6379> SELECT index

(5)删除当前库的数据

删除当前选择的数据库中的所有数据,这个命令永远不会出现失败。

127.0.0.1:6379[1]> FLUSHDB

(6)删除所有库的数据

删除所有数据库里面的数据,注意是所有数据库,这个命令永远不会出现失败。

127.0.0.1:6379[1]> FLUSHALL

(7)查看key的数量

查看当前选择的库中key的数量

127.0.0.1:6379> DBSIZE

测试以上命令

neu@neu:~$ redis-server --daemonize yes --port 6378 --requirepass 123456
28518:C 26 Oct 20:52:56.389 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
28518:C 26 Oct 20:52:56.389 # Redis version=4.0.9, bits=64, commit=00000000, modified=0, pid=28518, just started
28518:C 26 Oct 20:52:56.389 # Configuration loaded
neu@neu:~$ redis-cli -p 6378 -a 123456
127.0.0.1:6378> set name jiangyou  # 在第0个数据库插入一个值
OK
127.0.0.1:6378> select 1  # 选择第1个数据库
OK
127.0.0.1:6378[1]> set age 26    # 在第1个数据库插入一个值
OK
127.0.0.1:6378[1]> DBSIZE     # 第1个数据库当前的key值数量
(integer) 1
127.0.0.1:6378[1]> FLUSHDB    # 删除第1个数据库的所有值
OK
127.0.0.1:6378[1]> DBSIZE     # 删除后数据库中没有值
(integer) 0
127.0.0.1:6378[1]> SELECT 0     # 切换到第0个数据库
OK
127.0.0.1:6378> DBSIZE      # 第1个数据库的值存在,因此FLUSHDB只删除第1个数据库的所有值
(integer) 1
127.0.0.1:6378> SELECT 1    
OK
127.0.0.1:6378[1]> FLUSHALL   # 切换到第1个数据库,使用FLUSHALL删除所有数据库的值
OK
127.0.0.1:6378[1]> SELECT 0
OK
127.0.0.1:6378> DBSIZE    # 切换到第0个数据库,发现所有的值已被删除
(integer) 0

2、Key的操作命令:

该部分指令主要是为了对数据库中的key进行增删改查等一些列操作,下面主要介绍几个常用的命令。

(1)查找符合模板的Key

KEYS pattern

该指令查找数据库所有符合pattern的key,其中pattern可以为?、* 、[abc…]、[a-d]等方式。其中?代表一个任意一个字符,*代表任意0个或多个字符,[abc…]代表只能是[]中的值,[a-d]代表a到d范围内总的值。

127.0.0.1:6378> keys *
1) "age"
2) "school"
3) "home"
4) "name"
127.0.0.1:6378> keys *e
1) "age"
2) "home"
3) "name"
127.0.0.1:6378> keys a?e
1) "age"
127.0.0.1:6378> keys [a-n][ao]me
1) "home"
2) "name"
127.0.0.1:6378> keys [a-n][a]me
1) "name"

(2)查找存在key的数量

EXISTS key or [key…]

该指令为了查找一个或多个key,返回存在key值的数量。

127.0.0.1:6378> exists name
(integer) 1
127.0.0.1:6378> exists name home id
(integer) 2

(3)设置过期时间

EXPIRE key seconds

expire 设置 key 的过期时间,时间过期后,key 会被自动删除,设置成功返回1,key不存在返回0。

TTL key

ttl 命令以秒为单位返回key的剩余过期时间,如果key不存在返回 -2 key 存在但没有关联超时时间则返回 -1 。

127.0.0.1:6378> expire name 30
(integer) 1
127.0.0.1:6378> ttl name
(integer) 26
127.0.0.1:6378> ttl name
(integer) -2
127.0.0.1:6378> ttl age
(integer) -1
127.0.0.1:6378> ttl id
(integer) -2

(4)Key所属类型

TYPE key

type命令以字符串的形式返回存储在 key 中的值的类型,可返回的类型有:string, list, set, zset,hashstream,如果key值不存在返回none

127.0.0.1:6378> set key1 "value"
OK
127.0.0.1:6378> lpush key2 "value"
(integer) 1
127.0.0.1:6378> SADD key3 "value"
(integer) 1
127.0.0.1:6378> type key1
string
127.0.0.1:6378> type key2
list
127.0.0.1:6378> type key3
set
127.0.0.1:6378> type key
none

(5)删除Key

DEL key or [key…]

del命令删除指定的key,不存在的key忽略,返回0,如果key存在,返回删除的key的个数。

127.0.0.1:6378> del key
(integer) 0
127.0.0.1:6378> del key1 key2
(integer) 2

3、字符串类型—string命令:

字符串是Redis中最常见的数据类型,它能够存储任何形式的字符串,其中包括二进制格式,JSON格式,序列化格式等数据。而string相关的命令则是用于管理redis字符串值,下面介绍一些常见命令。

(1)基础命令

  • SETset命令将key是定为指定的字符串,如果key存在,则会覆盖原来的值。
SET key value [EX seconds] [PX milliseconds] [NX|XX]
  • 其中set可以为设定的值设置过期时间,EX表示秒数,PX表示毫秒。参数NX表示只有键key不存在的时候才会设置key的值,XX表示只有键key存在的时候才会设置key的值。
  • GETget命令返回与键 key 相关联的字符串值。
GET key
  • 如果key不存在,返回nil,如果key的值是非字符串类型,那么返回一个错误。
  • APPENDappend命令将指定的key追加值。如果key存在,并且是字符串,则会将value追加到key原值的末尾,如果key值是非字符串则会报错,当key不存在时候,改命令类似于set,简单将key设定为value。
APPEND KEY_NAME NEW_VALUE
• 1

INCR

incr 命令将 key 中储存的数字值增一。如果key不存在,key值会被初始化为0,在进行incr操作。如果字符串类型的值不能表示为数字,则会报错。

INCR KEY_NAME

DECR

decr命令将 key 中储存的数字值减一,和incr命令相似。

DECR KEY_NAME

(2)常用命令

  • STRLEN
    Strlen 命令将获取指定 key 所储存的字符串值的长度,如果key存储的不是字符串类型或不存在时,返回错误。
STRLEN KEY_NAME

SETRANG

Setrange命令是将从偏移量 offset 开始, 用 value 参数覆盖键 key 储存的字符串值。

SETRANGE key offset value
  • 不存在的键 key 当作空白字符串处理,如果键 key 原来储存的字符串长度比偏移量小,那么原字符和偏移量之间的空白将用零字节("\x00" )进行填充。
  • GETRANGGetrange命令返回存储在 key 中的字符串的子串,由 startend 偏移决定(都包括在内)。负数偏移提供相对字符串结尾的偏移。并且该命令会通过将结果范围限制为字符串的实际长度来处理超出范围的请求。
GETRANGE key start end
  • 当key不存在返回空字符串。
  • MSET命令设置多个 key 的值为各自对应的 value。如果key存在,则会用新值替换旧值,如果key不存在,会重新创建,该命令总是返回“OK”,因为 MSET不会失败。
MSET key value [key value ...]

MGET

命令返回所有(一个或多个)给定 key 的值,值的类型是字符串。 如果给定的 key 里面有某个 key 不存在或者值不是字符串,那么这个 key 返回特殊值 nil

MGET key [key ...]

测试以上命令

127.0.0.1:6379> set name jiang XX   #  XX表示只有键key存在的时候才会设置key的值
(nil)
127.0.0.1:6379> set name jiang NX   #  NX表示只有键key不存在的时候才会设置key的值
OK
127.0.0.1:6379> get name   #  返回与键 `key` 相关联的字符串值。
"jiangyou"
127.0.0.1:6379> get age    #  键key不存在的时候返回nil
(nil)

使用append可以将value追加到对应key的value尾部,并返回加上后的value的长度:

127.0.0.1:6379> EXISTS mykey1
(integer) 1
127.0.0.1:6379> APPEND mykey1 "Hello"
(integer) 19
127.0.0.1:6379> get mykey1
"I am the best!Hello"
127.0.0.1:6379> APPEND mykey1

设置age 的值,并设置了过期时间 EX表示秒:

127.0.0.1:6379> set age 24 EX 30   #  设置age 的值,并设置了过期时间  EX表示秒
OK
127.0.0.1:6379> incr age       #  在age上进行增 1
(integer) 25
127.0.0.1:6379> get age
"25"
127.0.0.1:6379> decr age       #  在age上进行减 1
(integer) 24
127.0.0.1:6379> get age
"24"
127.0.0.1:6379> incr name      #  由于name值不能表示数字,无法增1
(error) ERR value is not an integer or out of range
127.0.0.1:6379> STRLEN name    #  name对应的string的长度
(integer) 8

Setrange命令是将从偏移量 offset 开始, 用 value 参数覆盖键 key 储存的字符串值。

Getrange命令返回存储在 key 中的字符串的子串,由 start 和 end 偏移决定(都包括在内)。负数偏移提供相对字符串结尾的偏移。并且该命令会通过将结果范围限制为字符串的实际长度来处理超出范围的请求。

127.0.0.1:6379> SETRANGE name 10 hahaha     # 从偏移量为10 的位置开始加入hahaha
(integer) 16
127.0.0.1:6379> get name              # 不足的用\x00 补充
"jiangyou\x00\x00hahaha"
127.0.0.1:6379> GETRANGE name 0 -1    # 获取name的值,改方式类似于python的数组查找
"jiangyou\x00\x00hahaha"
127.0.0.1:6379> MSET age 26 home liaoning   #  为多个key赋值
OK
127.0.0.1:6379> MGET age  home addr    #   查找多个key对应的值,不存在的key返回nil。
1) "26"
2) "liaoning"
3) (nil)

4、列表—list命令:

(1)基本命令

  • LPUSHLpush 将一个或多个值插入到列表key 的头部。如果 key 不存在,那么在进行 push 操作前会创建一个空列表。如果 key 对应的值不是 list 类型,那么会返回一个错误。可以使用一个命令把多个元素 push 进入列表。
LPUSH key value [value ...]

RPUSH

Rpush 将向存储在 key 中的列表的尾部插入所有指定的值。如果 key 不存在,那么会创建一个空的列表然后再进行 push 操作。 当 key 保存的不是列表,那么会返回一个错误。

RPUSH key value [value ...]

LRANGE

Lrange将返回列表中指定区间内的元素(闭区间),区间以偏移量 START 和 END 指定。 其中 0 表示列表的第一个元素, 1 表示列表的第二个元素,以此类推。 你也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。如果start大于最大小标,那么叫返回空列表。

LRANGE key start stop

RPUSH

Rpush 将向存储在 key 中的列表的尾部插入所有指定的值。如果 key 不存在,那么会创建一个空的列表然后再进行 push 操作。 当 key 保存的不是列表,那么会返回一个错误。

RPUSH key value [value ...]

LRANGE

Lrange将返回列表中指定区间内的元素(闭区间),区间以偏移量 START 和 END 指定。 其中 0 表示列表的第一个元素, 1 表示列表的第二个元素,以此类推。 你也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。如果start大于最大小标,那么叫返回空列表。

LRANGE key start stop

LINDEX

Lindex 将返回列表 key 里索引 index 位置存储的元素。 index 下标是从 0 开始索引的,所以 0 是表示第一个元素, 1 表示第二个元素,并以此类推。 负数索引用于指定从列表尾部开始索引的元素,在这种方法下,-1 表示最后一个元素,-2 表示倒数第二个元素,并以此往前推。当 key 值不是列表的时候,会返回错误。

LINDEX key index

LLEN

Llen 将用于返回存储在 key 中的列表长度。 如果 key 不存在,则 key 被解释为一个空列表,返回 0 。 如果 key 不是列表类型,返回一个错误。

LLEN key

(2)常用命令

LREM

Lrem将用于从列表 key 中删除前 count 个值等于 element 的元素。 这个 count 参数通过下面几种方式影响这个操作,如果count > 0, 从头到尾删除值为 value 的元素;如果count < 0,将从尾到头删除值为 value 的元素;如果 count = 0 将移除所有值为 value 的元素

LREM key count value

LSET

Lset 将用于设置列表 key 中 index 位置的元素值为 element

LSET key index value

LSET

Lset 将用于设置列表 key 中 index 位置的元素值为 element

LSET key index value

测试上面命令:

127.0.0.1:6379> RPUSH myarrs 1 1 1 1 2 2   #  从list的右边开始往myarrs里面添加值
(integer) 6
127.0.0.1:6379> LRANGE myarrs 0 -1       # 返回myarrs的List中所有值
1) "1"
2) "1"
3) "1"
4) "1"
5) "2"
6) "2"
127.0.0.1:6379> LPUSH myarrs 0 0 -1   # 从list的左边开始往myarrs里面添加值
(integer) 9
127.0.0.1:6379> LRANGE myarrs 0 -1
1) "-1"
2) "0"
3) "0"
4) "1"
5) "1"
6) "1"
7) "1"
8) "2"
9) "2"
127.0.0.1:6379> LINDEX myarrs -2    # 根据索引返回List中的值
"2"
127.0.0.1:6379> LLEN myarrs         # 返回List中元素个数
(integer) 9

LREM将用于从列表 key 中删除前 count 个值等于 element 的元素。 这个 count 参数通过下面几种方式影响这个操作,如果count > 0, 从头到尾删除值为 value 的元素;如果count < 0,将从尾到头删除值为 value 的元素;如果 count = 0 将移除所有值为 value 的元素。

LREM key count value

如下第一句即从头开始算,删除前2个value值为1的键值对:

127.0.0.1:6379> LREM myarrs 2 1     # 删除myarrs中的1  count为2  所以从头往尾删除两个1
(integer) 2
127.0.0.1:6379> LRANGE myarrs 0 -1
1) "-1"
2) "0"
3) "0"
4) "1"
5) "1"
6) "2"
7) "2"
127.0.0.1:6379> LREM myarrs -1 1    # 删除myarrs中的1  count为-1  所以从尾往头删除1个1
(integer) 1
127.0.0.1:6379> LRANGE myarrs 0 -1  
1) "-1"
2) "0"
3) "0"
4) "1"
5) "2"
6) "2"

如果 count = 0 将移除所有值为 value 的元素:

127.0.0.1:6379> LREM myarrs 0 2   # 删除myarrs中的2  count为0  删除所有等于2的元素
(integer) 2
127.0.0.1:6379> LRANGE myarrs 0 -1
1) "-1"
2) "0"
3) "0"
4) "1"
127.0.0.1:6379> LSET myarrs 2 5    # 根据索引设置myarrs的值,将索引为2 的位置赋值为5
OK
127.0.0.1:6379> LRANGE myarrs 0 -1  
1) "-1"
2) "0"
3) "5"
4) "1"
127.0.0.1:6379> LINSERT myarrs before 5 4  # 在第一个值为5的位置的前面插入一个4
(integer) 5
127.0.0.1:6379> LRANGE myarrs 0 -1
1) "-1"
2) "0"
3) "4"
4) "5"
5) "1"

5、哈希类型—hash命令:

hash类似于java中的HashMap,在Reids中做了更多的优化。此外hash是一个string类型的field和value的映射表,特别适合用于存储对象。例如我们可以借用hash数据结构来存储用户信息,商品信息等。

(1)基本命令

HSET

Hset 命令用于为存储在 key 中的哈希表的 field 字段赋值 value 。如果哈希表不存在,一个新的哈希表被创建并进行 HSET 操作。如果字段(field)已经存在于哈希表中,旧值将被覆盖。

HSET key field value

HGET

Hget 命令用于返回哈希表中指定字段 field 的值。如果给定的字段或 key 不存在时,返回 nil 。

HGET key field

HMSET

Hmset 命令用于同时将多个 field-value (字段-值)对设置到哈希表中。此命令会覆盖哈希表中已存在的字段,如果哈希表不存在,会创建一个空哈希表,并执行 HMSET 操作。

HMSET key field value [field value ...]

HGETALL

Hgetall 命令用于返回存储在 key 中的哈希表中所有的域和值。返回值以列表形式返回哈希表的字段及字段值,若 key 不存在,返回空列表。

HGETALL key

HDEL

Hdel 命令用于删除哈希表 key 中的一个或多个指定域,不存在的域将被忽略。 如果 key 不存在,会被当作空哈希表处理并返回 0

HDEL key field [field ...]

(2)常用命令

  • HEXISTS
    Hexists 命令用于查看哈希表的指定字段field 是否存在。如果表含有给定字段field会返回1,否则返回0。
HEXISTS key field

HKEYS

Hkeys返回存储在 key 中哈希表的所有域。当 key 不存在时,返回空表。

HKEYS key

HVALS

Hvals 命令返回哈希表所有域(field)的值。当 key 不存在时,返回空表。

HVALS key

测试以上命令

127.0.0.1:6379> HSET userinfo name jiangyou     #  创建新的hash表,并存入对象userinfo的name属性
(integer) 1                                     #  返回赋值成功域的个数
127.0.0.1:6379> HSET userinfo age 26 home liaoming school neu    #  设置userinfo对象的多个域的值
(integer) 3                                     #  返回赋值成功域的个数
127.0.0.1:6379> HKEYS userinfo                  #  查看userinfo的所有域的名
1) "name"
2) "age"
3) "home"
4) "school"
127.0.0.1:6379> HKEYS users                     #  当key不存在时,返回空
(empty list or set)
127.0.0.1:6379> HVALS userinfo                  #  返回key值的所有域的值
1) "jiangyou"
2) "26"
3) "liaoming"
4) "neu"
127.0.0.1:6379> HEXISTS userinfo name           #  查看哈希表的指定字段`name` 该字段存在,返回1
(integer) 1
127.0.0.1:6379> HEXISTS userinfo addr           #  查看哈希表的指定字段`addr` 该字段存在,返回0
(integer) 0
127.0.0.1:6379> HGETALL userinfo                #  查看哈希表中存储在 `key` 中的所有的域和值
1) "name"
2) "jiangyou"
3) "age"
4) "26"
5) "home"
6) "liaoming"
7) "school"
8) "neu"
127.0.0.1:6379> HGETALL users                   #  `key` 不存在,会被当作空哈希表处理并返回。
(empty list or set)
127.0.0.1:6379> HDEL userinfo school home       #   删除哈希表 key 中的一个或多个指定域,返回的为成功删除的域的个数。
(integer) 2
127.0.0.1:6379> HGETALL userinfo
1) "name"
2) "jiangyou"
3) "age"
4) "26"

6、集合类型—set命令:

(1)基本命令

  • SADDSadd 将命令将一个或多个成员元素加入到集合中,已经存在于集合的成员元素将被忽略。假如集合 key 不存在,则创建一个只包含被添加的元素作为成员的集合。当集合 key 不是集合类型时,返回一个错误。
SADD key member [member ...]

SMEMBERS

Smembers 将返回存储在 key 中的集合的所有的成员。 不存在的集合被视为空集合。

SMEMBERS key

SISMEMBER

Sismember 将用于判断元素 member 是否集合 key 的成员。如果成员元素是集合的成员,返回 1 ;如果成员元素不是集合的成员,或 key 不存在,返回0。

SISMEMBER key member

SCARD

Scard 将返回集合中元素的数量。

SCARD key

SREM

Srem将在集合中删除指定的元素。如果指定的元素不是集合成员则被忽略。如果集合 key 不存在则被视为一个空的集合,该命令返回0。如果key的类型不是一个集合,则返回错误。

SCARD key member [member ...]

(2)常用命令

  • SRANDMEMBERSrandmember 将仅使用key 参数,那么随机返回集合key 中的一个随机元素。如果count是整数且小于元素的个数,返回含有 count 个不同的元素的数组,如果count是个整数且大于集合中元素的个数时,返回整个集合的所有元素,当count是负数,则会返回一个包含count的绝对值的个数元素的数组,如果count的绝对值大于元素的个数,则返回的结果集里会出现一个元素出现多次的情况。
 SRANDMEMBER key [count]

SPOP

Spop 将从集合 key中删除并返回一个或多个随机元素。这个命令和 SRANDMEMBER相似, SRANDMEMBER 只返回随机成员但是不删除这些返回的成员。

SRANDMEMBER key [count]

测试以上命令

127.0.0.1:6379> SADD name zhangsan lisi wangwu   #  赋值key为name的set集合,返回赋值成功的个数
(integer) 3
127.0.0.1:6379> SMEMBERS name                    #  查看存储在name中的集合的所有的成员。
1) "zhangsan"
2) "lisi"
3) "wangwu"
127.0.0.1:6379> SISMEMBER name zhangsan          #  判断元素 zhangsan 是否集合 name 的成员,如果是  返回1
(integer) 1
127.0.0.1:6379> SISMEMBER name xuliu             #  判断元素 xuliu 是否集合 name 的成员,如果不是  返回0
(integer) 0
127.0.0.1:6379> SCARD name
(integer) 3
127.0.0.1:6379> SREM name zhangsan xuliu       #  删除 name 的成员,如果存在直接删除,否则忽略。返回删除成功的元素个数
(integer) 1
127.0.0.1:6379> SMEMBERS name
1) "lisi"
2) "wangwu"
127.0.0.1:6379> SRANDMEMBER name 5  # 随机返回集合name中的一个随机元素,count为5 大于集合个数,返回整个集合元素 
1) "lisi"
2) "wangwu"
127.0.0.1:6379> SRANDMEMBER name 1  # 随机返回集合name中的一个随机元素,count为1 随机返回集合中任意一个元素
1) "wangwu"
127.0.0.1:6379> SRANDMEMBER name -5  # 随机返回集合name中的一个随机元素,count为-5 返回的结果集里会出现一个元素出现多次
1) "wangwu"
2) "lisi"
3) "lisi"
4) "lisi"
5) "wangwu"
127.0.0.1:6379> SPOP name 0  # 随机删除并返回集合name中的一个或多个随机元素,count为0 返回的结果集里不会出现任何元素
(empty array)
127.0.0.1:6379> SPOP name 1  # 随机删除并返回集合name中的一个或多个随机元素,count为1 返回的结果集里会出现一个元素出现多次
1) "lisi"
127.0.0.1:6379> SPOP name -5 # 随机删除并返回集合name中的一个或多个随机元素,count 不能为负数。
(error) ERR value is out of range, must be positive

7、有序集合类型—sortedset命令:

(1)基本命令

  • ZADDZadd 将一个或多个 member 元素及其 score 值加入到有序集 key 当中。如果某个 member 已经是有序集的成员,那么更新这个 member 的 score 值,并通过重新插入这个 member 元素,来保证该 member 在正确的位置上。如果有序集合 key 不存在,则创建一个空的有序集并执行 ZADD操作。当 key 存在但不是有序集类型时,返回一个错误。score 值可以是整数值或双精度浮点数,score 可为正也可以为负。
ZADD key [NX|XX] [CH] [INCR] score member [score member ...]

XX: 仅更新存在的成员,不添加新成员。

NX: 不更新存在的成员。只添加新成员。

LT: 更新新的分值比当前分值小的成员,不存在则新增。

GT: 更新新的分值比当前分值大的成员,不存在则新增。

CH: 返回变更成员的数量。变更的成员是指 新增成员 和 score值更新的成员,命令指明的和之前score值相同的成员不计在内。 注意: 在通常情况下,ZADD返回值只计算新添加成员的数量。

INCR: ZADD 使用该参数与 ZINCRBY 功能一样。一次只能操作一个score-element对。

ZRANG

Zrange将返回有序集中,指定区间内(闭区间)的成员,其中成员的按分数值递增(从小到大)来排序,具有相同分数值的成员按字典序(lexicographical order )来排列。如果你需要成员按值递减(从大到小)来排列,可以使用 ZREVRANGE命令。下标参数 start 和 stop 都以 0 为底,也就是说,以 0 表示有序集第一个成员,以 1 表示有序集第二个成员,以此类推。其中 start和stop参数的细节同 ZRANG命令。

ZRANGE key start stop [WITHSCORES]

ZREVRANGE

Zervrange 将返回有序集key中,指定区间内的成员。其中成员的位置按score值递减(从高到低)来排列。具有相同score值的成员按字典序的反序排列。 除了成员排序相反外,ZREVRANGE命令的其他方面和ZRANGE命令一样。

ZREVRANGE key start stop [WITHSCORES]

ZREM

Zrem 将从有序集合key中删除指定的成员member。如果member不存在则被忽略。当key存在,但是不是有序集合类型时,返回类型错误。返回的是从有序集合中删除的成员个数,不包括不存在的成员。

ZREM key member [member ...]

ZCARD

Zcard 将返回有序集的成员个数。 当 key 不存在时,返回 0

ZCARD key

(2)常用命令

ZRANGEBYSCORE

该指令将返回有序集 key 中,所有 score 值介于 min 和 max 之间(包括等于 min 或 max )的成员。有序集成员按 score 值递增(从小到大)次序排列。具有相同 score 值的成员按字典序来排列(该属性是有序集提供的,不需要额外的计算)。可选的 LIMIT 参数指定返回结果的数量及区间(就像SQL中的 SELECT LIMIT offset, count ),注意当 offset 很大时,定位 offset 的操作可能需要遍历整个有序集,此过程最坏复杂度为 O(N) 时间。可选的 WITHSCORES 参数决定结果集是单单返回有序集的成员,还是将有序集成员及其 score 值一起返回。

ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]

ZREVRANGEBYSCORE

该指令将返回有序集合中指定分数区间的成员列表。有序集成员按分数值递增(从小到大)次序排列。具有相同分数值的成员按字典序来排列(该属性是有序集提供的,不需要额外的计算)。默认情况下,区间的取值使用闭区间 (小于等于或大于等于),你也可以通过给参数前增加 ( 符号来使用可选的开区间 (小于或大于)。可选的LIMIT参数指定返回结果的数量及区间(类似SQL中SELECT LIMIT offset, count)。注意,如果offset太大,定位offset就可能遍历整个有序集合,这会增加O(N)的复杂度。可选参数WITHSCORES会返回元素和其分数,而不只是元素。

ZREVRANGEBYSCORE  key min max [WITHSCORES] [LIMIT offset count]

ZCOUNT

Zcount 将返回有序集 key 中, score 值在 minmax 之间(默认包括 score 值等于 minmax )的成员的数量。

ZCOUNT key min max

1.3 使用Redis DeskTop Manager

启动Redis服务端的时候会有默认端口6379,这里用默认端口配置连接。

配置如下:

1)定一个名称,随意

2)服务端地址,域名或ID,

3)Redis 端口,默认 6379

4)如果设置了连接密码,那么需要设置密码

配置好之后点击 Test Connection 按钮,看是否可以连接成功,如果失败请检查一下配置信息。登录后是这样的界面:

image.png

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
存储 SQL JSON
【新闻推荐系统】(task2)MongoDB篇
本文属于新闻推荐实战—数据层—构建物料池之MongoDB。MongoDB数据库在该项目中会用来存储画像数据(用户画像、新闻画像),使用MongoDB存储画像的一个主要原因就是方便扩展,因为画像内容可能会随着产品的不断发展而不断的更新。作为算法工程师需要了解常用的MongoDB语法(比如增删改查,排序等),因为在实际的工作可能会从MongoDB中获取用户、新闻画像来构造相关特征。
596 0
【新闻推荐系统】(task2)MongoDB篇
|
机器学习/深度学习 搜索推荐 测试技术
【王喆-推荐系统】评估篇-(task2)推荐模型评估指标
准确率 (Accuracy) 是指分类正确的样本占总样本个数的比例。
1387 0
【王喆-推荐系统】评估篇-(task2)推荐模型评估指标
|
6月前
|
存储 监控 NoSQL
解密推荐系统:用Redis解决特征存储问题
解密推荐系统:用Redis解决特征存储问题
209 0
|
NoSQL 搜索推荐 Linux
【新闻推荐系统】(task2)Python调用Redis
在Python中,目前可以通过一个redis模块来实现操控Redis,下面我们简单的介绍一下关于使用redis模块。
453 0
【新闻推荐系统】(task2)Python调用Redis
|
存储 SQL 算法
【新闻推荐系统】(task2)mysql和pymysql使用
本文属于新闻推荐实战—数据层—构建物料池之MySQL。MySQL数据库在该项目中会用来存储结构化的数据(用户、新闻特征),作为算法工程师需要了解常用的MySQL语法(比如增删改查,排序等),因为在实际的工作经常会用来统计相关数据或者抽取相关特征。
211 0
【新闻推荐系统】(task2)mysql和pymysql使用
|
26天前
|
存储 缓存 NoSQL
数据的存储--Redis缓存存储(一)
数据的存储--Redis缓存存储(一)
60 1
|
26天前
|
存储 缓存 NoSQL
数据的存储--Redis缓存存储(二)
数据的存储--Redis缓存存储(二)
37 2
数据的存储--Redis缓存存储(二)
|
22天前
|
消息中间件 缓存 NoSQL
Redis 是一个高性能的键值对存储系统,常用于缓存、消息队列和会话管理等场景。
【10月更文挑战第4天】Redis 是一个高性能的键值对存储系统,常用于缓存、消息队列和会话管理等场景。随着数据增长,有时需要将 Redis 数据导出以进行分析、备份或迁移。本文详细介绍几种导出方法:1)使用 Redis 命令与重定向;2)利用 Redis 的 RDB 和 AOF 持久化功能;3)借助第三方工具如 `redis-dump`。每种方法均附有示例代码,帮助你轻松完成数据导出任务。无论数据量大小,总有一款适合你。
56 6
|
27天前
|
缓存 NoSQL 关系型数据库
redis和缓存及相关问题和解决办法 什么是缓存预热、缓存穿透、缓存雪崩、缓存击穿
本文深入探讨了Redis缓存的相关知识,包括缓存的概念、使用场景、可能出现的问题(缓存预热、缓存穿透、缓存雪崩、缓存击穿)及其解决方案。
127 0
redis和缓存及相关问题和解决办法 什么是缓存预热、缓存穿透、缓存雪崩、缓存击穿
|
2天前
|
存储 缓存 监控
利用 Redis 缓存特性避免缓存穿透的策略与方法
【10月更文挑战第23天】通过以上对利用 Redis 缓存特性避免缓存穿透的详细阐述,我们对这一策略有了更深入的理解。在实际应用中,我们需要根据具体情况灵活运用这些方法,并结合其他技术手段,共同保障系统的稳定和高效运行。同时,要不断关注 Redis 缓存特性的发展和变化,及时调整策略,以应对不断出现的新挑战。
21 10