1.Redis字符串结构
对于Redis来说,所有的key都是字符串,其value可以是string,list,hash,set,zset
比如下面的
键值对的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(二):字符串类型的更多相关文章
-
如何搭建高可用redis架构?
如何搭建高可用redis架构? 温国兵 架构师小秘圈 昨天 作者:温国兵,曾任职于酷狗音乐,现为三七互娱 DBA.目前主要关注领域:数据库自动化运维.高可用架构设计.数据库安全.海量数据解决方案.以及 ...
-
Mycat高可用解决方案二(主从复制)
Mycat高可用解决方案二(主从复制) 系统部署规划 名称 IP 主机名称 用户名/密码 配置 mysql主节点 192.168.199.110 mysql-01 root/hadoop 2核/2G ...
-
Redis从出门到高可用--Redis复制原理与优化
Redis从出门到高可用–Redis复制原理与优化 单机有什么问题? 1.单机故障; 2.单机容量有瓶颈 3.单机有QPS瓶颈 主从复制:主机数据更新后根据配置和策略,自动同步到备机的master/s ...
-
redis数据类型-字符串类型
Redis数据类型 字符串类型 字符串类型是Redis中最基本的数据类型,它能存储任何形式的字符串,包括二进制数据.你可以用其存储用户的邮箱.JSON化的对象甚至是一张图片.一个字符串类型键允许存储的 ...
-
高可用Redis服务架构分析与搭建
基于内存的Redis应该是目前各种web开发业务中最为常用的key-value数据库了,我们经常在业务中用其存储用户登陆态(Session存储),加速一些热数据的查询(相比较mysql而言,速度有数量 ...
-
使用Docker Compose部署基于Sentinel的高可用Redis集群
使用Docker Compose部署基于Sentinel的高可用Redis集群 https://yq.aliyun.com/articles/57953 Docker系列之(五):使用Docker C ...
-
第二百九十五节,python操作redis缓存-字符串类型
python操作redis缓存-字符串类型 首先要安装redis-py模块 python连接redis方式,有两种连接方式,一种是直接连接,一张是通过连接池连接 注意:以后我们都用的连接池方式连接,直 ...
-
centos下搭建高可用redis
Linux下搭建高可用Redis缓存 Redis是一个高性能的key-value数据库,现时越来越多企业与应用使用Redis作为缓存服务器.楼主是一枚JAVA后端程序员,也算是半个运维工程师了.在Li ...
-
高可用Redis服务架构分析与搭建(单redis实例)
原文地址:https://www.cnblogs.com/xuning/p/8464625.html 基于内存的Redis应该是目前各种web开发业务中最为常用的key-value数据库了,我们经常在 ...
随机推荐
-
HTTP Error 500 - Server Error.
Error Details: The FastCGI process exited unexpectedly Error Number: -1073741819 (0xc0000005). Error ...
-
Monte Carlo Approximations
准备总结几篇关于 Markov Chain Monte Carlo 的笔记. 本系列笔记主要译自A Gentle Introduction to Markov Chain Monte Carlo (M ...
-
hdoj 2899 Strange fuction【二分求解方程】
Strange fuction Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)T ...
-
Mysql iot表
我们知道一般的表都以堆(heap)的形式来组织的,这是无序的组织方式. Oracle还提供了一种有序的表,它就是索引组织表,简称IOT表.IOT表上必须要有主键,而IOT表本身不对应segment,表 ...
-
POJ 1716 Integer Intervals#贪心
(- ̄▽ ̄)-* //求一个集合,这个集合与任意一个区间的交集,需至少有两个数字 //贪心过程:按n个区间的最右值从小到大对区间进行排列, //集合首先取第一个区间的最右两个数字, //到第二个区间, ...
-
js动画 Css提供的运动 js提供的运动
1. 动画 (1) Css样式提供了运动 过渡的属性transition 从一种情况到另一种情况叫过渡 Transition:attr time linear delay: ...
-
DAO层基础设计原理
在实际的开发中有一种项目的程序组织架构方案叫做MVC模式,按照程序 的功能将他们分成三个层,如下图 Modle层(模型层).View层(显示层).Controller层(控制层). Modle层:可以 ...
-
Android Studio中的Gradle是干什么的
作者:ghui链接:https://www.zhihu.com/question/30432152/answer/48239946来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注 ...
-
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 ...
-
android:怎么实现一个控件与另一个指定控件左对齐
https://segmentfault.com/q/1010000003905460?_ea=425861 针对你这种情况,最简单的一种办法是,设置两个TextView的宽度为固定值,且相等. Li ...