当前位置:网站首页>redis基础
redis基础
2022-08-02 14:05:00 【weixin_45773632】
文章目录
Redis 概述
Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
redis-benchmark 性能测试
语法:
[[email protected] bin]# redis-benchmark --help
Usage: redis-benchmark [-h <host>] [-p <port>] [-c <clients>] [-n <requests>] [-k <boolean>]
-h <hostname> Server hostname (default 127.0.0.1)
-p <port> Server port (default 6379)
-s <socket> Server socket (overrides host and port)
-a <password> Password for Redis Auth
--user <username> Used to send ACL style 'AUTH username pass'. Needs -a.
-c <clients> 线程数(多个连接) (default 50)
-n <requests> 请求数量 (default 100000)
-d <size> Data size of SET/GET value in bytes (default 3)
--dbnum <db> SELECT the specified db number (default 0)
--threads <num> Enable multi-thread mode.
--cluster Enable cluster mode.
--enable-tracking Send CLIENT TRACKING on before starting benchmark.
-k <boolean> 1=keep alive 0=reconnect (default 1)
-r <keyspacelen> Use random keys for SET/GET/INCR, random values for SADD
Using this option the benchmark will expand the string __rand_int__
inside an argument with a 12 digits number in the specified range
from 0 to keyspacelen-1. The substitution changes every time a command
is executed. Default tests use this to hit random keys in the
specified range.
-P <numreq> Pipeline <numreq> requests. Default 1 (no pipeline).
-e If server replies with errors, show them on stdout.
(no more than 1 error per second is displayed)
-q Quiet. Just show query/sec values
--precision Number of decimal places to display in latency output (default 0)
--csv Output in CSV format
-l Loop. Run the tests forever
-t <tests> Only run the comma separated list of tests. The test
names are the same as the ones produced as output.
-I Idle mode. Just open N idle connections and wait.
测试:
[[email protected] bin]# redis-benchmark -h 127.0.0.1 -p 6379 -c 100 -n 100000
====== PING_INLINE ======
100000 requests completed in 1.42 seconds # 100000个请求
100 parallel clients # 100个并发客户端
3 bytes payload # 每次写入3个字节数据
keep alive: 1 # 单机
host configuration "save": 900 1 300 10 60 10000
host configuration "appendonly": no
multi-thread: no
0.00% <= 0.2 milliseconds
0.07% <= 0.3 milliseconds
0.44% <= 0.4 milliseconds
1.06% <= 0.5 milliseconds
2.92% <= 0.6 milliseconds
46.30% <= 0.7 milliseconds
80.05% <= 0.8 milliseconds
88.17% <= 0.9 milliseconds
91.94% <= 1.0 milliseconds
94.14% <= 1.1 milliseconds
95.20% <= 1.2 milliseconds
95.99% <= 1.3 milliseconds
96.60% <= 1.4 milliseconds
97.08% <= 1.5 milliseconds
97.50% <= 1.6 milliseconds
97.88% <= 1.7 milliseconds
98.25% <= 1.8 milliseconds
98.61% <= 1.9 milliseconds
98.95% <= 2 milliseconds
100.00% <= 2 milliseconds
70571.62 requests per second
====== PING_BULK ======
100000 requests completed in 1.47 seconds
100 parallel clients
3 bytes payload
keep alive: 1
host configuration "save": 900 1 300 10 60 10000
host configuration "appendonly": no
multi-thread: no
83.95% <= 1 milliseconds
98.14% <= 2 milliseconds
99.86% <= 3 milliseconds
99.94% <= 4 milliseconds
100.00% <= 4 milliseconds
67934.78 requests per second
====== SET ======
100000 requests completed in 1.53 seconds
100 parallel clients
3 bytes payload
keep alive: 1
host configuration "save": 900 1 300 10 60 10000
host configuration "appendonly": no
multi-thread: no
73.92% <= 1 milliseconds
98.02% <= 2 milliseconds
99.87% <= 3 milliseconds
99.99% <= 4 milliseconds
100.00% <= 4 milliseconds
65274.15 requests per second
redis 基础操作
- redis默认有16个数据库,默认使用第0个,可以使用select 切换数据库
127.0.0.1:6379> SELECT 3
OK
127.0.0.1:6379[3]>
- dbsize 查看数据库大小
127.0.0.1:6379[3]> DBSIZE
(integer) 0
127.0.0.1:6379[3]>
- 查看数据库中所有的key
127.0.0.1:6379> keys *
1) "myhash:{tag}:__rand_int__"
2) "counter:{tag}:__rand_int__"
3) "key:{tag}:__rand_int__"
4) "name"
5) "mylist:{tag}"
- 清空全部数据库
127.0.0.1:6379> FLUSHALL
OK
127.0.0.1:6379> keys *
(empty array)
- 清空当前数据库
127.0.0.1:6379> FLUSHALL
OK
127.0.0.1:6379> keys *
(empty array)
redis 数据类型
Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。 它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 与范围查询, bitmaps, hyperloglogs 和 地理空间(geospatial) 索引半径查询。
1.string (字符串)
(1) 添加键值对
- 一次添加一个键值对:
set
语法:set key value [EX seconds|PX milliseconds] [NX|XX] [KEEPTTL]
- EX seconds – 设置键key的过期时间,单位时秒
- PX milliseconds – 设置键key的过期时间,单位时毫秒
- NX – 只有键key不存在的时候才会设置key的值 (相当于:
setnx key value) - XX – 只有键key存在的时候才会设置key的值(相当于:
setex key value)
- 添加多个键值对:
mset
语法:mset key value [key value ...]
(2) 删除键值对
del key:删除key对应的键值对
(3) 修改键值对
追加字符串:
append key value
如果 key 已经存在,并且值为字符串,那么这个命令会把 value 追加到原来值(value)的结尾。 如果 key 不存在,那么它将首先创建一个空字符串的key,再执行追加操作。从offset开始插入value:
setrange key offset value
(4) 获取指定key对应的value相关信息
- 返回指定下标范围的子串:
getrange key start end - 获取key对应value的长度:
strlen key ttl key:查看key的过期时间;type key:返回key对应的值的存储类型;
(5) 数值操作
- 执行类似
i++的操作:incr key
对存储在指定key的数值执行原子的加1操作。如果指定的key不存在,那么在执行incr操作之前,会先将它的值设定为0。如果指定的key中存储的值不是字符串类型(fix:)或者存储的字符串类型不能表示为一个整数,那么执行这个命令时服务器会返回一个错误(eq:(error) ERR value is not an integer or out of range)。这个操作仅限于64位的有符号整型数据。
redis> SET mykey "10"
OK
redis> INCR mykey
(integer) 11
redis> GET mykey
"11"
redis>
注意: decr 执行相反的操作
- 执行类似
i+=x的操作:incrby key increment
将key对应的数字加xdecrement。如果key不存在,操作之前,key就会被置为0。如果key的value类型错误或者是个不能表示成数字的字符串,就返回错误。这个操作最多支持64位有符号的正型数字。
注意:decrby 执行相反的操作
2.List(列表)
(1) 向list中添加值
lpush key element [element ...]:在list的左端push值 (相反的命令为rpush key element [element ...])
List上的阻塞操作:
可以使用Redis来实现生产者和消费者模型,如使用LPUSH和RPOP实现该功能。但会遇到这种情景:list是空,这时候消费者就需要轮询来获取数据,这样就会增加redis的访问压力、增加消费端的cpu时间,而很多访问都是无用的。为此redis提供了阻塞式访问BRPOP和BLPOP命令。 消费者可以在获取数据时指定如果数据不存在阻塞的时间,如果在时限内获得数据则立即返回,如果超时还没有数据则返回null, 0表示一直阻塞。同时redis还会为所有阻塞的消费者以先后顺序排队。linsert key BEFORE|AFTER pivot element:
把 value 插入存于 key 的列表中在基准值 pivot 的前面或后面。当 key 不存在时,这个list会被看作是空list,任何操作都不会发生。当 key 存在,但保存的不是一个list的时候,会返回error。
(2) 删除list中的值
lpop key: 删除最左侧的值rpop key:删除最右侧的值lrem key count element:删除list中的element,删除count个ltrim key start stop:只保留[start,staop]部分的值
(3) 修改list中的值
lset key index element:设置 index 位置的list元素的值为 value
(4) 获取list中值的信息
lrange key start stop:从左侧开始取出[start,stop]内的值,start从0开始;如果是[0,-1]的话,则取出全部的值lindex key index获取下标index处的值llen key:获取list的长度
3. Set(集合)
(1) 向集合中添加元素
sadd key member [member ...]:
添加一个或多个指定的member元素到集合的 key中.指定的一个或者多个元素member 如果已经在集合key中存在则忽略.如果集合key 不存在,则新建集合key,并添加member元素到集合key中.如果key 的类型不是集合则返回错误.
(2) 移除set中的元素
srem key member [member ...]:
在key集合中移除指定的元素. 如果指定的元素不是key集合中的元素则忽略 如果key集合不存在则被视为一个空的集合,该命令返回0.如果key的类型不是一个集合,则返回错误.
(3) 修改set
SMOVE source destination member:将member从source集合移动到destination集合中.
(4) 获取set相关的信息
scard key:获取集合中元素的个数sismember key member:判断集合中是否存在定的membersmembers key:返回集合中所有的元素SINTERSTORE destination key [key ...]:这个命令与SINTER命令类似, 但是它并不是直接返回结果集,而是将结果保存在 destination集合中.SINTERSTORE destination key [key …]SRANDMEMBER key [count]:仅提供key参数,那么随机返回key集合中的一个元素.
(5) set的集合运算
sdiff key [key ...]:返回一个集合与给定集合的差集的元素.SINTER key [key ...]:返回指定所有的集合的成员的交集.
4.Hash(哈希)
(1) 添加 field value
HSET key field value:将member从source集合移动到destination集合中.HMSET key field value [field value ...]:设置 key 指定的哈希集中指定字段的值。该命令将重写所有在哈希集中存在的字段。如果 key 指定的哈希集不存在,会创建一个新的哈希集并与 key 关联。HSETNX key field value:只在 key 指定的哈希集中不存在指定的字段时,设置字段的值。如果 key 指定的哈希集不存在,会创建一个新的哈希集并与 key 关联。如果字段已存在,该操作无效果。
(2) 删除 field
HDEL key field [field ...]:从 key 指定的哈希集中移除指定的field。在哈希集中不存在的field将被忽略。如果 key 指定的哈希集不存在,它将被认为是一个空的哈希集,该命令将返回0。
(3) 获取field对应的value
HGET key field:返回 key 指定的哈希集中该字段所关联的值HGETALL key:返回 key 指定的哈希集中所有的字段和值。返回值中,每个字段名的下一个是它的值,所以返回值的长度是哈希集大小的两倍。HKEYS key:返回 key 指定的哈希集中所有字段的名字。HVALS key:返回 key 指定的哈希集中所有字段的值。HLEN key:返回 key 指定的哈希集包含的字段的数量。HEXISTS key field:返回hash里面field是否存在
5. zset(sorted set:有序集合)
6. geospatial (地理位置)
应用:朋友的定位,附近的人,打车距离计算等等。
6.1 GEOADD
geoadd key longitude latitude member

6.2 GEODIST
geodist key member1 member2 [m|km|ft|mi]
- m 表示单位为米。
- km 表示单位为千米。
- mi 表示单位为英里。
- ft 表示单位为英尺。

6.3 GEOHASH
返回值:一个数组, 数组的每个项都是一个 geohash 。 命令返回的 geohash 的位置与用户给定的位置元素的位置一一对应。
6.4 GEOPOS
返回值:从key里返回所有给定位置元素的位置(经度和纬度)。
geopos key member

6.5 GEORADIUS
GEORADIUS key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count(限定个数)] [ASC|DESC] [STORE key] [STOREDIST key]

6.6 GEORADIUSBYMEMBER
注意:这个命令和 GEORADIUS 命令一样, 都可以找出位于指定范围内的元素, 但是 GEORADIUSBYMEMBER 的中心点是由给定的位置元素决定的, 而不是像 GEORADIUS 那样, 使用输入的经度和纬度来决定中心点指定成员的位置被用作查询的中心。
GEORADIUSBYMEMBER key member radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count(限定个数)] [ASC|DESC] [STORE key] [STOREDIST key]
注意:
GEO底层的实现原理其实就是Zset !我们可以使用Zset命令来操作geo !
hyperloglogs
hyperloglogs 基数统计的算法,
- pfadd key element // 可添加多个element
- pfcount key 统计key元素的基数数量
- pfmerge key key1 key2 将key1和key2合并到key3中

如果允许容错,则一定可以使用hyperloglogs。
bitmaps

getbit sign offset //offset就是下标,
bitcount sign [start ,end ] // 统计指定范围内的 1 的数量
redis 事务
redis事务本质:一组命令的集合!一个事务中的所有命令都会被序列化,在事务的执行过程中,会按照顺序执行!
----------队列 set set set 执行 ---------
Redis事务没有没有隔离级别的概念!
所有的命令在事务中,并没有直接被执行!只有发起执行命令的时候才会执行! ExecRedis单条命令是保存原子性的,但是事务不保证原子性!
redis的事务∶
- 开启事务(multi )
- 命令入队(开启事务后的操作会自动入队)
- 执行事务( exec)

- 放弃事务(discard) : 事务队列中的所有命令都不会执行!
事务中出现错误如何处理?

redis watch:(乐观锁)
事务成功案例:
127.0.0.1:6379> set money 100
OK
127.0.0.1:6379> set out 0
OK
127.0.0.1:6379> watch money
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> decrby money 20
QUEUED
127.0.0.1:6379> incrby out 20
QUEUED
127.0.0.1:6379> exec
1) (integer) 80
2) (integer) 20
测试多线程修改值,使用watch可以当作redis的乐观锁操作!
如果修改失败,获取最新的值就好。
边栏推荐
猜你喜欢
随机推荐
基于ThinkPHP6.0 - 宝塔搭建漫画CMS管理系统源码实测
verilog学习|《Verilog数字系统设计教程》夏宇闻 第三版思考题答案(第十章)
Introduction and use of Haystack
C语言——断言assert的使用
2022最新交规记忆重点
Deep learning framework pytorch rapid development and actual combat chapter4
MySQL知识总结 (六) MySQL调优
Implementation of redis distributed lock and watchdog
St. Regis Takeaway Notes - Lecture 10 Swagger
浮点数的运算方法
Linux: CentOS 7 install MySQL5.7
字符串的小知识
无人驾驶综述:摘要
MySQL知识总结 (十) 一条 SQL 的执行过程详解
verilog学习|《Verilog数字系统设计教程》夏宇闻 第三版思考题答案(第九章)
C语言待解决
Ehcache基础学习
C语言sizeof和strlen的区别
Unit 14 Viewsets and Routing
Programming Specifications - LiteOS





![[ROS] The software package of the industrial computer does not compile](/img/a8/a1347568170821e8f186091b93e52a.png)



