详解Redis基本命令与使用场景

Redis和Memcached对比

其中有一个比较重要的区别是关于其提供的数据结构区别

Memcached

在其数据结构中仅使用字符串和整数。因此,您保存的所有内容都可以是字符串或整数。它很复杂,因为对于整数,您可以做的唯一数据操作是添加或减去它们。如果需要保存数组或对象,则必须先将它们序列化然后保存。要阅读它们,您需要取消序列化。

Redis

具有更强大的数据结构,它不仅可以处理字符串整数,还可以处理二进制安全字符串,二进制安全字符串列表,二进制安全字符串集和有序集。

关于Redis的数据结构:https://zhuanlan.zhihu.com/p/270592490

基本命令

# 如果k1的值设置过,就不设置,如果k1的值没有设置,才会设置k1的值为hello

# msetnx 同理

set k1 hello nx

# 如果k2没设置,就不能设置k2的值为hello,如果k2的值设置过,才能把他设置过hello

set k2 hello xx

# 设置多个值,其中把k1设置xx,把k2设置为33

mset k1 xx k2 33

# 拼接字符串

APPEND k1 " world"

# 范围查找(从0开始)

GETRANGE k1 0 1

# 范围查找(逆序,最右边编号从-1开始)

# 所以0,-1 就是拿到整个字符串

GETRANGE k1 0 -1

# 把k1字符串的第1个(从第0个位置开始)用xxx开始替换后续的字符

# 如果k1是hello,那么执行完下面的语句,k1会被设置为:hxxxo

SETRANGE k1 1 xxx

# 获取k1字符串的长度

STRLEN k1

# 获取数据类型

TYPE k1

# 查询某个命令的使用,如下命令,就是查询SET命令如何使用

help SET

# k1的值+1

INCR k1

# k1的值+22

INCRBY k1 22

# k1的值-1

DECR k1

# k1的值-22

DECRBY k1 22

# k1的值+0.5

INCRBYFLOAT k1 0.5

# 可以使用--raw选项在终端上强制进行原始输出

127.0.0.1:6379> set k3 中

OK

127.0.0.1:6379> get k3

"\xe4\xb8\xad"

127.0.0.1:6379> exit

[root@node1 utils]# redis-cli --raw

127.0.0.1:6379> get k3

# 获取k1的值,然后把k1的值设置为hello

GETSET k1 hello

# 设置k1的值为a,如果要把k1的值变为b,也可以通过setbit操作

# 也就是将 01100001 变成 01100010 (a的ASCII码是97,b的ASCII码是98),也就是将'a'中的offset 6从0变成1,将offset 7 从1变成0  (从0开始算)

set k1 a

setbit k1 6 1

setbit k1 7 0

# 查找字符串里面bit值为1的位置 (从左边开始数)

set k1 a

bitpos k1 1

结果为:1

# bitpos的 start end指的是字节位置

# 查找字符串里面bit值为1从第0个字节开始的位置

set k1 ab

BITPOS k1 1 0

1

# 查找字符串里面bit值为0从第1个字节开始的位置

# 其中9的ASCII码为00111001 a的ascii码为01100001

# 所以a9的ASCII码为01100001 00111001

# BITPOS k1 0 1取的位置就是:01100001 ‘0'0111001 中‘'圈住的位置

set k1 a9

BITPOS k1 0 1

9

# BITPOS找不到则返回-1

# 例如:查找字符串里面bit值为1的位置

set k1 "\x00\x00\x00"

BITPOS k1 1

-1

# bitcount统计的是1的数量, bitcount key [start, end] , 其中的start和end指的是byte位置而非bit位置。

# a的ASCII码为01100001

set k1 a

bitcount k1

3

场景1:统计每个用户的登录天数

假设jack这名用户,分别在第6天,第23天,第134天,和第364天登录了系统。

可以执行如下命令:

setbit jack 6 1setbit jack 23 1setbit jack 134 1setbit jack 364 1

统计jack登录的天数,直接可以通过:

bitcount jack

场景2:电商网站派发礼物

假设某个电商网站做活动,在某天要派送礼物,假设这个网站有2亿用户,请问应该备货多少礼物比较适合

思路:

首先,可以考虑一下统计整个网站的活跃用户有多少,比如我们设置三天,1号,2号,3号,统计三天登录的用户获得一个近似的活跃用户的数量:

# 编号为2的用户登在2019年1月1号录了一次

setbit 20190101   2  1

# 编号为3的用户在2019年1月2号登录了一次

setbit 20190102   3  1

# 编号为7的用户在2019年1月2号登录了一次

setbit 20190102   7  1

# 编号为7的用户在2019年1月3号登录了一次

setbit 20190103   7  1

然后通过:

# 将每一天标识的人数(位置上为1)的数进行与运算

bitop  or   destkey 20190101  20190102  20190103

然后求这个destkey中含有的1的数量,即为比较活跃的用户(派发礼物需要准备的礼物数量)

BITCOUNT destkey

抢购,秒杀,详情页,点赞,评论

都可以使用Redis的incr 方法,这样就可以规避并发下,对数据库的事务操作,完全由redis内存操作代替

更多命令

# lpush和lpop搭配可以实现栈的功能

# lpush和rpop搭配可以实现队列的功能

# 从左边进

lpush k1 a b c

# 从左边弹出

lpop k1

c

# lrange可以从左到右列出元素

lpush k1 a b c

lrange k1

1) "c"

2) "b"

3) "a"

# lindex 可以定位某个元素(从左边开始,从0开始)

lindex k1 0

"c"

# lset 可以设置某个位置的元素

lset k1 0 xxxxx

lrange k1 0 -1

1) "xxxxx"

2) "b"

3) "a"

#LREM key count value

#根据参数 count 的值,移除列表中与参数 value 相等的元素。

#count 的值可以是以下几种:

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

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

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

LREM k3 2 a

# LINSERT 

lpush k1 a b c d e f g

linsert k1 after b 6 # 也可以用before

lrange k1 0 -1

1) "g"

2) "f"

3) "e"

4) "d"

5) "c"

6) "b"

7) "6"

8) "a"# lpush和lpop搭配可以实现栈的功能

# lpush和rpop搭配可以实现队列的功能

# 从左边进

lpush k1 a b c

# 从左边弹出

lpop k1

c

# lrange可以从左到右列出元素

lpush k1 a b c

lrange k1

1) "c"

2) "b"

3) "a"

# lindex 可以定位某个元素(从左边开始,从0开始)

lindex k1 0

"c"

# lset 可以设置某个位置的元素

lset k1 0 xxxxx

lrange k1 0 -1

1) "xxxxx"

2) "b"

3) "a"

#当 BLPOP被调用时,如果给定 key 内至少有一个非空列表,那么弹出遇到的第一个非空列表的头元素,并和被弹出元素所属的列表的名字 key 一起,组成结果返回给调用者。

# BLPOP可以实现单播FIFO队列

blpop x y z 0

# 打开另外一个redis-cli

# 然后执行

lpush y xxxsd

# 可以看到blpop x y z 0

# 返回了参数

blpop x y z 0

1) "y"

2) "xxxsd"

# blpop 最后一个参数是超时时间,如果设置为0,则不超时

# trim掉第三号元素之前和第五号元素之后的元素,从左边第0个位置开始算

lpush k1 a b c d e f g

(integer) 15

ltrim k1 1 3

OK

lrange k1 0 -1

1) "f"

2) "e"

3) "d"

# Hash

hset person name zs

(integer) 1

hset person age 18 address GZ

(integer) 2

hmget person name age address

1) "zs"

2) "18"

3) "GZ"

hkeys person

1) "name"

2) "age"

3) "address"

hvals person

1) "zs"

2) "18"

3) "GZ"

hgetall person

1) "name"

2) "zs"

3) "age"

4) "18"

5) "address"

6) "GZ"

hincrbyfloat person age 0.5

"18.5"

hincrbyfloat person age -1

"17.5"

sadd k1 a  b c a

(integer) 3

smembers k1

1) "b"

2) "a"

3) "c"

srem k1 a

(integer) 1

smembers k1

1) "b"

2) "c"

# 交集sinter,类似的,还有并集:sunion,差集:sdiff

# sinerstore k k1 k2 将k1和k2交集后的元素存入k

sadd k1 a b c

SMEMBERS k1

1) "a"

2) "c"

3) "b"

sadd k2 a b d

(integer) 3

SINTER k1 k2

1) "a"

2) "b"

SUNION k1 k2

1) "a"

2) "d"

3) "b"

4) "c"

SDIFF k1 k2

"c"

#SRANDMEMBER 命令接受可选的 count 参数:

#如果 count 为正数,且小于集合基数,那么命令返回一个包含 count 个元素的数组,数组中的元素各不相同。如果 count 大于等于集合基数,那么返回整个集合。

#如果 count 为负数,那么命令返回一个数组,数组中的元素可能会重复出现多次,而数组的长度为 count 的绝对值。

# 可以用来抽奖

SRANDMEMBER k3 -3

1) "b"

2) "b"

3) "c"

#有序集

#sorted_set

#Z开头的命令,ZADD,ZCOUNT

zadd fruit 8 apple 2 banana 3 orange

zrange fruit 0 -1

1) "banana"

2) "orange"

3) "apple"

zrange fruit 0 -1 withscores

1) "banana"

2) "2"

3) "orange"

4) "3"

5) "apple"

6) "8"

zcount fruit 3 8

(integer) 2

zscore fruit apple

"8"

#价格由低到高取出前两位

zarange k1 0 1

#价格由高到低取出前两位

zrevarange k1 0 1

zscore fruit apple

"8"

zrank fruit banana

0

zincrby fruit 2.5 banana

"4.5"

127.0.0.1:6379> zadd k1 2 a 3 b 4 c

(integer) 3

127.0.0.1:6379> zadd k2 3 a 1 b 2 c

(integer) 3

127.0.0.1:6379> ZUNIONSTORE k4 2 k1 k2

(integer) 3

127.0.0.1:6379> zrange k4 0 -1

1) "b"

2) "a"

3) "c"

127.0.0.1:6379> ZUNIONSTORE k4 2 k1 k2 aggregate sum

(integer) 3

127.0.0.1:6379> zrange k4 0 -1

1) "b"

2) "a"

3) "c"

127.0.0.1:6379> ZUNIONSTORE k4 2 k1 k2 aggregate max

(integer) 3

127.0.0.1:6379> zrange k4 0 -1

1) "a"

2) "b"

3) "c"

127.0.0.1:6379> ZUNIONSTORE k4 2 k1 k2 aggregate min

(integer) 3

127.0.0.1:6379> zrange k4 0 -1

1) "b"

2) "a"

3) "c"

通过管道连接Redis发送命令

yum install nc

[root@node01 ~]# nc localhost 6379

keys *

*0

set k1 heelo

+OK

[root@node1 utils]# echo -e "set k2 99\nincr k2\n get k2" | nc localhost 6379

+OK

:100

$3

100

发布/订阅功能

127.0.0.1:6379> subscribe xxx

Reading messages... (press Ctrl-C to quit)

1) "subscribe"

2) "xxx"

3) (integer) 1

1) "message"

2) "xxx"

3) "hellod"

127.0.0.1:6379> publish xxx hellod

(integer) 1

如果需要考虑获取实时数据和历史数据

关于实时数据

  • pub/sub功能关于历史消息
  • 三天前(sorted_set)
  • 更早以前(来自数据库)

架构如下:

Redis的事务

执行顺序

示例

127.0.0.1:6379> MULTI

OK

127.0.0.1:6379(TX)> set k1 aa

QUEUED

127.0.0.1:6379(TX)> set k2 ddd

QUEUED

127.0.0.1:6379(TX)> exec

1) OK

2) OK

watch用法

127.0.0.1:6379> watch k1

OK

127.0.0.1:6379> MULTI

OK

127.0.0.1:6379(TX)> get k1

QUEUED

127.0.0.1:6379(TX)> keys *

QUEUED

127.0.0.1:6379(TX)> exec

(nil)

另外一个客户端

127.0.0.1:6379> MULTI

OK

127.0.0.1:6379(TX)> keys *

QUEUED

127.0.0.1:6379(TX)> set k1 ddsdfasdf

QUEUED

127.0.0.1:6379(TX)> exec

1) (empty array)

2) OK

为什么 Redis 的事务不支持回滚(roll back)

摘自:http://www.redis.cn/topics/transactions.html

如果你有使用关系式数据库的经验, 那么 “Redis 在事务失败时不进行回滚,而是继续执行余下的命令”这种做法可能会让你觉得有点奇怪。

以下是这种做法的优点:

Redis 命令只会因为错误的语法而失败(并且这些问题不能在入队时发现),或是命令用在了错误类型的键上面:这也就是说,从实用性的角度来说,失败的命令是由编程错误造成的,而这些错误应该在开发的过程中被发现,而不应该出现在生产环境中。因为不需要对回滚进行支持,所以 Redis 的内部可以保持简单且快速。有种观点认为 Redis 处理事务的做法会产生 bug , 然而需要注意的是, 在通常情况下, 回滚并不能解决编程错误带来的问题。 举个例子, 如果你本来想通过 INCR 命令将键的值加上 1 , 却不小心加上了 2 , 又或者对错误类型的键执行了 INCR , 回滚是没有办法处理这些情况的。

以上就是详解Redis基本命令与使用场景的详细内容,更多关于Redis基本命令与使用场景的资料请关注我们其它相关文章!

(0)

相关推荐

  • PHP操作Redis常用命令的实例详解

    redis常用命令有: 1.连接操作命令: 2.持久化命令: 3.远程服务控制命令: 4.对value操作命令:5.string命令: 6.list命令: 7.set命令: 8.hash命令等等. Redis 常用命令 登录 redis-cli -p 5566 -a password 检查key是否存在 EXISTS key 搜索某关键字 KSYS *4 返回一个Key所影响的vsl的类型 TYPE key 下面通过代码看下PHP操作Redis命令,代码如下所示: //连接本地的 Redis 服

  • 查看Redis内存信息的命令

    查看Redis内存使用 info 命令用于监控Redis运行情况,其中 info memory 可以查看Redis内存使用统计信息: redis-cli info memory 命令输出结果如下图: 前几个字段信息最为重要,其含义分别为: 属性名 属性说明 used_memory Redis 分配器分配的内存总量,也就是内部存储的所有数据内存占用量 used_memory_human 以可读的格式返回 used_memory used_memory_rss 从操作系统的角度显示 Redis 进程

  • redis中scan命令的基本实现方法

    前言 在一个天朗气清的日子,小灰登上了线上的redis打算查询数据.然而他只记得前缀而不知道整个键是多少,于是在命令行敲入了"keys xxx*"命令. 瞬间服务卡死,报警邮件堆满了邮箱,而小灰,只能目瞪狗呆的等待着即将降临的case study. 基本上,keys *命令都是在线上是被运维禁止的. redis的键在键值对大小大于hash-max-ziplist-value且个数小于hash-max-ziplist-entries的时候,是存放在散列表数据结构中的,在运行keys命令的

  • redis哨兵常用命令和监控示例详解

    sentinel monitor advertise 192.168.0.5 28001 2 sentinel set advertise client-reconfig-script /etc/redis/reconfig.sh sentinel flushconfig sentinel启动后需要手动将配置文件对应的调整为sentinel deny-scripts-reconfig no,否则不支持命令行runtime修改client-reconfig-script # SECURITY #

  • Redis的KEYS 命令千万不能乱用

    KESY 命令 时间复杂度: O(N) , 假设Redis中的键名和给定的模式的长度有限的情况下,N为数据库中key的个数. Redis Keys 命令用于查找所有符合给定模式 pattern 的 key 尽管这个操作的时间复杂度是 O(N), 但是常量时间相当低.例如,在一个普通笔记本上跑Redis,扫描100万个key只要40毫秒. 命令格式 KEYS pattern Warning: 生产环境使用 KEYS 命令需要非常小心.在大的数据库上执行命令会影响性能.这个命令适合用来调试和特殊操作

  • 详解centos7 yum安装redis及常用命令

    redis是什么 Redis是一种基于内存的数据结构存储,可持久化的日志型.Key-Value数据库.使用关系型数据库的站点达到一定并发量的时候,往往在磁盘IO上会有瓶颈,这时候配合redis就有一定的优势,因为它具有以下几个特性: 基于内存运行,高并发读写: 支持分布式,理论上可以无限扩展: 丰富的数据类型: 持久化,可定时写入磁盘: 应用场景 缓存"热点"数据(高频读.低频写) 计数器,限流器 消息队列系统(发布订阅,排行榜) 分布式锁,共享session,队列 数据类型: Red

  • Redis遍历所有key的两个命令(KEYS 和 SCAN)

    当我们需要遍历Redis所有key或者指定模式的key时,首先想到的是KEYS命令: KEYS pattern 官网对于KEYS命令有一个提示:  KEYS 的速度非常快,例如,Redis在一个有1百万个key的数据库里面执行一次查询需要的时间是40毫秒 .但在一个大的数据库中使用它仍然可能造成性能问题,如果你需要从一个数据集中查找特定的  KEYS , 你最好还是用 Redis 的集合结构  SETS  来代替. KEYS命令使用很简单. redis> MSET one 1 two 2 thr

  • Redis常用数据类型命令实例汇总

    存储sortedset: 存储:zadd key score menber1 score menber2 ... 升序排列:zrange key start end [withscores] 降序排列:zrevrange key start end [withscores] 取得前三名: 按照排名范围删除元素:zremrangebyrank key start stop 例,删除3名到最后一名: 返回成员在集合中的排名(从小到大): zrank key member keys的通用操作: 删除指

  • php操作redis命令及代码实例大全

    官方PHP Redis扩展文件下载 https://pecl.php.net/package/redis 选择与你PHP版本相应的文件下载后直接放到PHP目录下的ext文件夹里,然后修改php.ini配置文件如下 php.ini文件添加:extension=php_redis.dll 重启php, phpinfo可以看到redis则证明安装成功 php连接redis测试 <?php $redis = new Redis(); $redis->connect('127.0.0.1', 6379)

  • 详解Redis基本命令与使用场景

    Redis和Memcached对比 其中有一个比较重要的区别是关于其提供的数据结构区别 Memcached 在其数据结构中仅使用字符串和整数.因此,您保存的所有内容都可以是字符串或整数.它很复杂,因为对于整数,您可以做的唯一数据操作是添加或减去它们.如果需要保存数组或对象,则必须先将它们序列化然后保存.要阅读它们,您需要取消序列化. Redis 具有更强大的数据结构,它不仅可以处理字符串整数,还可以处理二进制安全字符串,二进制安全字符串列表,二进制安全字符串集和有序集. 关于Redis的数据结构

  • 详解redis中的锁以及使用场景

    分布式锁 什么是分布式锁? 分布式锁是控制分布式系统之间同步访问共享资源的一种方式. 为什么要使用分布式锁? ​ 为了保证共享资源的数据一致性. 什么场景下使用分布式锁? ​ 数据重要且要保证一致性 如何实现分布式锁? 主要介绍使用redis来实现分布式锁 redis事务 redis事务介绍: ​ 1.redis事务可以一次执行多个命令,本质是一组命令的集合. ​ 2.一个事务中的所有命令都会序列化,按顺序串行化的执行而不会被其他命令插入 ​ **作用:**一个队列中,一次性.顺序性.排他性的执

  • 详解Redis命令和键_动力节点Java学院整理

    Redis命令用于在redis服务器上执行某些操作. 要在Redis服务器上运行的命令,需要一个Redis客户端. Redis客户端在Redis的包,这已经我们前面安装使用过了. 语法 Redis客户端的基本语法如下: $redis-cli 例子 下面举例说明如何使用Redis客户端. 要启动redis客户端,打开终端,输入命令Redis命令行:redis-cli.这将连接到本地服务器,现在就可以运行各种命令了. $redis-cli redis 127.0.0.1:6379> redis 12

  • 详解Redis的慢查询日志

    Redis慢查询日志帮助开发和运维人员定位系统存在的慢操作.慢查询日志就是系统在命令执行前后计算每条命令的执行时间,当超过预设阀值,就将这条命令的相关信息(慢查询ID,发生时间戳,耗时,命令的详细信息)记录下来. Redis客户端一条命令分为如下四部分执行: 需要注意的是,慢查询日志只是统计步骤3)执行命令的时间,所以慢查询并不代表客户端没有超时问题.需要注意的是,慢查询日志只是统计步骤3)执行命令的时间,所以慢查询并不代表客户端没有超时问题. 一.慢查询的配置参数: 慢查询的预设阀值 slow

  • 详解Redis中的List类型

    本系列将和大家分享Redis分布式缓存,本章主要简单介绍下Redis中的List类型,以及如何使用Redis解决博客数据分页.生产者消费者模型和发布订阅等问题. Redis List的实现为一个双向链表,即可以支持反向查找和遍历,更方便操作,不过带来了部分额外的内存开销,Redis内部的很多实现,包括发送缓冲队列等也都是用这个数据结构. List类型主要用于队列和栈,先进先出,后进先出等. 存储形式:key--LinkList<value> 首先先给大家Show一波Redis中与List类型相

  • 详解redis缓存与数据库一致性问题解决

    数据库与缓存读写模式策略 写完数据库后是否需要马上更新缓存还是直接删除缓存? (1).如果写数据库的值与更新到缓存值是一样的,不需要经过任何的计算,可以马上更新缓存,但是如果对于那种写数据频繁而读数据少的场景并不合适这种解决方案,因为也许还没有查询就被删除或修改了,这样会浪费时间和资源 (2).如果写数据库的值与更新缓存的值不一致,写入缓存中的数据需要经过几个表的关联计算后得到的结果插入缓存中,那就没有必要马上更新缓存,只有删除缓存即可,等到查询的时候在去把计算后得到的结果插入到缓存中即可. 所

  • 详解Redis实现限流的三种方式

    面对越来越多的高并发场景,限流显示的尤为重要. 当然,限流有许多种实现的方式,Redis具有很强大的功能,我用Redis实践了三种的实现方式,可以较为简单的实现其方式.Redis不仅仅是可以做限流,还可以做数据统计,附近的人等功能,这些可能会后续写到. 第一种:基于Redis的setnx的操作 我们在使用Redis的分布式锁的时候,大家都知道是依靠了setnx的指令,在CAS(Compare and swap)的操作的时候,同时给指定的key设置了过期实践(expire),我们在限流的主要目的就

  • 详解Redis主从复制实践

    复制简介 Redis 作为一门非关系型数据库,其复制功能和关系型数据库(MySQL)来说,功能其实都是差不多,无外乎就是实现的原理不同.Redis 的复制功能也是相对于其他的内存性数据库(memcached)所具备特有的功能. Redis 复制功能主要的作用,是集群.分片功能实现的基础:同时也是 Redis 实现高可用的一种策略,例如解决单机并发问题.数据安全性等等问题. 服务介绍 在本文环境演示中,有一台主机,启动了两个 Redis 示例. 实现方式 Redis 复制实现方式分为下面三种方式:

  • 详解redis分布式锁的这些坑

    一.白话分布式 什么是分布式,用最简单的话来说,就是为了较低单个服务器的压力,将功能分布在不同的机器上面,本来一个程序员可以完成一个项目:需求->设计->编码->测试 但是项目多的时候,一个人也扛不住,这就需要不同的人进行分工合作了 这就是一个简单的分布式协同工作了: 二.分布式锁 首先看一个问题,如果说某个环节被终止或者别侵占,就会发生不可知的事情 这就会出现,设计好的或者设计的半成品会被破坏,导致后面环节出错: 这时候,我们就需要引入分布式锁的概念: 何为分布式锁 当在分布式模型下,

  • 详解Redis复制原理

    前言 本文主要介绍Redis复制机制 一.配置与实践 配置 Redis实例分为主节点(master)和从节点(slave),默认情况下都是主节点.每一个从节点只能有一个主节点,但是每一个主节点可以有多个从节点(注意数量,多个从节点会导致主节点写命令多次发送从而过度消耗网络带宽,可用树状结构降低主节点负载).复制是单向的,只能从主节点复制到从节点.配置复制的方式由以下3种: 在redis-slave.conf配置文件中加入slaveof {masterHost} {masterPort} 在red

随机推荐