高可用Redis(二):字符串类型

时间:2021-03-16 01:03:15

1.Redis字符串结构

对于Redis来说,所有的key都是字符串,其value可以是string,list,hash,set,zset

比如下面的

高可用Redis(二):字符串类型

键值对的value还可以更加复杂,比如可以是json格式,xml格式,序列化等

字符串类型的value的长度不能大于512MB。

在实际生产中,如果一个值保存成500MB的话,获取这个值的时候会占用很多的网络流量,其次读取的时候也会非常慢,这对于Redis这种单线程应用来说并不明智

在生产环境中,考虑到并发和网络流量的因素,value的大小建议在100KB以内

Redis字符串的使用场景:

缓存
计数器,比如视频网站中视频的播放次数统计等
分布式锁

2.Redis字符串相关命令

2.1 get命令,set命令和del命令

get key				获取key对应的value
set key value 设置key-value
del key 删除key-value

例子:

127.0.0.1:6379> set hello 'world'
OK
127.0.0.1:6379> get hello
"world"
127.0.0.1:6379> del hello
(integer) 1
127.0.0.1:6379> get hello
(nil)

注意事项:

get命令,set命令和del命令的时间复杂度都是O(1)

2.2 整型操作命令

incr key		key自增1,如果key不存在,自增后get(key) = 1
decr key key自减1,如果key不存在,自减后get(key) = -1
incrby key k key自增k,如果key不存在,自增后get(key) = k
decrby key k key自减k,如果key不存在,自减后get(key) = -k

例子:

127.0.0.1:6379> get counter
(nil)
127.0.0.1:6379> incr counter
(integer) 1
127.0.0.1:6379> get counter
"1"
127.0.0.1:6379> incrby counter 99
(integer) 100
127.0.0.1:6379> get counter
"100"
127.0.0.1:6379> decr counter
(integer) 99
127.0.0.1:6379> get counter
"99"
127.0.0.1:6379> decrby counter 50
(integer) 49
127.0.0.1:6379> get counter
"49"

注意事项:

incr/decr命令和incrby/decrby命令时间复杂度为O(1)
Redis是天然适合做计数器的
Redis是单线程的,顺序执行,并发执行incr命令不会有竞争的问题,不会计错数

实战

记录网站每个用户的个人主页的访问量,可以使用如下命令

incr userid:pageview(单线程:无竞争)

说明:假如一个用户的id为123,初始pageview为0,别的用户每浏览一次123用户的主页,pageview自增1,这样每个用户id的访问量就进行了区分。

2.3 set命令和setnx命令

set key value			不管key是否存在,都进行设置
setnx key value key不存在,才进行设置
set key value xx key存在才设置

例子:

127.0.0.1:6379> exists python
(integer) 1
127.0.0.1:6379> del python
(integer) 1
127.0.0.1:6379> exists python
(integer) 0
127.0.0.1:6379> set python good
OK
127.0.0.1:6379> setnx python good
(integer) 0
127.0.0.1:6379> set python base xx
OK
127.0.0.1:6379> get python
"base"
127.0.0.1:6379> exists python
(integer) 1
127.0.0.1:6379>
127.0.0.1:6379>
127.0.0.1:6379> exists java
(integer) 0
127.0.0.1:6379> setnx java easy
(integer) 1
127.0.0.1:6379> set java aaa xx
OK
127.0.0.1:6379> get java
"aaa"

注意事项:

set命令和setnx命令的时间复杂度为O(1)

2.4 mget命令和mset命令

mget key1 key2 key3                         批量获取key,原子操作
mset key1 value1 key2 value2 key3 value3 批量设置key-value

例子:

127.0.0.1:6379> mset hello world python best php easy
OK
127.0.0.1:6379> mget hello python php
1) "world"
2) "best"
3) "easy"

注意事项:

1.mget命令和mset命令的时间复杂度为O(n)
2.使用get命令获取某个key的值,server端计算后返回对应的值给client端
此时如果想获取n个key的值,需要传输n次,server端也需要计算n次,这样所需要的时间为 n次get = n次网络时间 + n次命令时间
3.如果使用mget命令一次传递n个key的值到server端,只需要传输一次,server端计算之后,一次性把计算结果返回给client端
这样所需要的时间为:1次mget = 1次网络时间 + n次命令时间
4.在很多场景中,使用mget命令的效率比get命令效率高很多,mget命令后接的key越多效率越明显,但是当key的量很多时,可以对key进行拆分,分批获取key的值,

2.5 getset命令,append命令和strlen命令

getset key newvalue     set key newvalue并返回旧的value
append key value 将value追加到旧的value
strlen key 返回字符串的长度(注意中文)

例子:

127.0.0.1:6379> set hello world
OK
127.0.0.1:6379> getset hello python
"world"
127.0.0.1:6379> append hello ',java'
(integer) 11
127.0.0.1:6379> get hello
"python,java"
127.0.0.1:6379> strlen(hello)
(error) ERR unknown command 'strlen(hello)'
127.0.0.1:6379> strlen hello
(integer) 11
127.0.0.1:6379> set hello '足球'
OK
127.0.0.1:6379> strlen hello
(integer) 6

注意事项:

getset命令,append命令和strlen命令的时间复杂度为O(1)

2.6 incrby命令,getrange命令和setrange命令

incrbyfloat key float		key自增float值
getrange key start end 获取字符串指定下标所有的值
setrange key index value 设置指定下标所有对应的值

例子:

127.0.0.1:6379> incr counter
(integer) 50
127.0.0.1:6379> del counter
(integer) 1
127.0.0.1:6379> incr counter
(integer) 1
127.0.0.1:6379> incrbyfloat counter 1.1
"2.1"
127.0.0.1:6379> get counter
"2.1"
127.0.0.1:6379> set hello pythonbest
OK
127.0.0.1:6379> getrange hello 0 6
"pythonb"
127.0.0.1:6379> getrange hello 0 5
"python"
127.0.0.1:6379> setrange hello 6 e
(integer) 10
127.0.0.1:6379> get hello
"pythoneest"

注意事项:

incrby命令,getrange命令和setrange命令的时间复杂度为O(1)

高可用Redis(二):字符串类型的更多相关文章

  1. 如何搭建高可用redis架构?

    如何搭建高可用redis架构? 温国兵 架构师小秘圈 昨天 作者:温国兵,曾任职于酷狗音乐,现为三七互娱 DBA.目前主要关注领域:数据库自动化运维.高可用架构设计.数据库安全.海量数据解决方案.以及 ...

  2. Mycat高可用解决方案二(主从复制)

    Mycat高可用解决方案二(主从复制) 系统部署规划 名称 IP 主机名称 用户名/密码 配置 mysql主节点 192.168.199.110 mysql-01 root/hadoop 2核/2G ...

  3. Redis从出门到高可用--Redis复制原理与优化

    Redis从出门到高可用–Redis复制原理与优化 单机有什么问题? 1.单机故障; 2.单机容量有瓶颈 3.单机有QPS瓶颈 主从复制:主机数据更新后根据配置和策略,自动同步到备机的master/s ...

  4. redis数据类型-字符串类型

    Redis数据类型 字符串类型 字符串类型是Redis中最基本的数据类型,它能存储任何形式的字符串,包括二进制数据.你可以用其存储用户的邮箱.JSON化的对象甚至是一张图片.一个字符串类型键允许存储的 ...

  5. 高可用Redis服务架构分析与搭建

    基于内存的Redis应该是目前各种web开发业务中最为常用的key-value数据库了,我们经常在业务中用其存储用户登陆态(Session存储),加速一些热数据的查询(相比较mysql而言,速度有数量 ...

  6. 使用Docker Compose部署基于Sentinel的高可用Redis集群

    使用Docker Compose部署基于Sentinel的高可用Redis集群 https://yq.aliyun.com/articles/57953 Docker系列之(五):使用Docker C ...

  7. 第二百九十五节,python操作redis缓存-字符串类型

    python操作redis缓存-字符串类型 首先要安装redis-py模块 python连接redis方式,有两种连接方式,一种是直接连接,一张是通过连接池连接 注意:以后我们都用的连接池方式连接,直 ...

  8. centos下搭建高可用redis

    Linux下搭建高可用Redis缓存 Redis是一个高性能的key-value数据库,现时越来越多企业与应用使用Redis作为缓存服务器.楼主是一枚JAVA后端程序员,也算是半个运维工程师了.在Li ...

  9. 高可用Redis服务架构分析与搭建(单redis实例)

    原文地址:https://www.cnblogs.com/xuning/p/8464625.html 基于内存的Redis应该是目前各种web开发业务中最为常用的key-value数据库了,我们经常在 ...

随机推荐

  1. HTTP Error 500 - Server Error.

    Error Details: The FastCGI process exited unexpectedly Error Number: -1073741819 (0xc0000005). Error ...

  2. Monte Carlo Approximations

    准备总结几篇关于 Markov Chain Monte Carlo 的笔记. 本系列笔记主要译自A Gentle Introduction to Markov Chain Monte Carlo (M ...

  3. hdoj 2899 Strange fuction【二分求解方程】

    Strange fuction Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)T ...

  4. Mysql iot表

    我们知道一般的表都以堆(heap)的形式来组织的,这是无序的组织方式. Oracle还提供了一种有序的表,它就是索引组织表,简称IOT表.IOT表上必须要有主键,而IOT表本身不对应segment,表 ...

  5. POJ 1716 Integer Intervals#贪心

    (- ̄▽ ̄)-* //求一个集合,这个集合与任意一个区间的交集,需至少有两个数字 //贪心过程:按n个区间的最右值从小到大对区间进行排列, //集合首先取第一个区间的最右两个数字, //到第二个区间, ...

  6. js动画 Css提供的运动 js提供的运动

    1.     动画 (1)      Css样式提供了运动 过渡的属性transition  从一种情况到另一种情况叫过渡 Transition:attr  time  linear  delay: ...

  7. DAO层基础设计原理

    在实际的开发中有一种项目的程序组织架构方案叫做MVC模式,按照程序 的功能将他们分成三个层,如下图 Modle层(模型层).View层(显示层).Controller层(控制层). Modle层:可以 ...

  8. Android Studio中的Gradle是干什么的

    作者:ghui链接:https://www.zhihu.com/question/30432152/answer/48239946来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注 ...

  9. org.springframework.web.util.WebUtils.isSameOrigin(WebUtils.java:816)

    Nginx反向代理WebSocket时报这个错,普通的http请求没问题,ws请求报错 可能原因: 1.你用了4.2.5.RELEASE版本或者4.2.6.RELEASE,升级到4.2.7.RELEA ...

  10. android:怎么实现一个控件与另一个指定控件左对齐

    https://segmentfault.com/q/1010000003905460?_ea=425861 针对你这种情况,最简单的一种办法是,设置两个TextView的宽度为固定值,且相等. Li ...