redis基础

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 性能测试

语法:

[root@VM-4-17-centos 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.

测试:

[root@VM-4-17-centos 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 基础操作

  1. redis默认有16个数据库,默认使用第0个,可以使用select 切换数据库
127.0.0.1:6379> SELECT 3
OK
127.0.0.1:6379[3]> 

  1. dbsize 查看数据库大小
127.0.0.1:6379[3]> DBSIZE
(integer) 0
127.0.0.1:6379[3]> 
  1. 查看数据库中所有的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}"
  1. 清空全部数据库
127.0.0.1:6379> FLUSHALL
OK
127.0.0.1:6379> keys *
(empty array)
  1. 清空当前数据库
127.0.0.1:6379> FLUSHALL
OK
127.0.0.1:6379> keys *
(empty array)

redis 数据类型

Redis 是一个开源(BSD许可)的内存中的数据结构存储系统,它可以用作数据库缓存消息中间件。 它支持多种类型的数据结构,如 字符串(strings)散列(hashes)列表(lists)集合(sets) 有序集合(sorted sets) 与范围查询, bitmapshyperloglogs地理空间(geospatial) 索引半径查询。

1.string (字符串)

(1) 添加键值对

  • 一次添加一个键值对:set
    语法:set key value [EX seconds|PX milliseconds] [NX|XX] [KEEPTTL]
  1. EX seconds – 设置键key的过期时间,单位时秒
  2. PX milliseconds – 设置键key的过期时间,单位时毫秒
  3. NX – 只有键key不存在的时候才会设置key的值 (相当于:setnx key value)
  4. 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来实现生产者和消费者模型,如使用LPUSHRPOP实现该功能。但会遇到这种情景:list是空,这时候消费者就需要轮询来获取数据,这样就会增加redis的访问压力、增加消费端的cpu时间,而很多访问都是无用的。为此redis提供了阻塞式访问 BRPOPBLPOP 命令。 消费者可以在获取数据时指定如果数据不存在阻塞的时间,如果在时限内获得数据则立即返回,如果超时还没有数据则返回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:判断集合中是否存在定的member
  • smembers 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事务没有没有隔离级别的概念!
所有的命令在事务中,并没有直接被执行!只有发起执行命令的时候才会执行! Exec
Redis单条命令是保存原子性的,但是事务不保证原子性!

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的乐观锁操作!
在这里插入图片描述
如果修改失败,获取最新的值就好。
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于学习Redis基础知识,可以按照以下思路进行学习: 1. 了解Redis的概念和特点:首先需要了解Redis是什么,它的主要特点是什么,它为什么被广泛应用于缓存、消息队列、会话管理等场景。 2. 安装和配置Redis:根据你的操作系统,安装Redis并进行相关配置。可以参考Redis官方文档或其他教程来完成这一步。 3. 学习Redis的数据结构:Redis支持多种数据结构,如字符串、哈希、列表、集合和有序集合等。了解每种数据结构的特点、用途和操作命令,并通过实际操作来加深理解。 4. 掌握Redis的常用命令:学习Redis的常用命令,如get、set、hget、hset、lpush、lrange、sadd、smembers等,了解每个命令的具体用法和参数含义。 5. 理解Redis的持久化机制:了解Redis的RDB和AOF两种持久化方式,以及它们的优缺点。学习如何进行备份和恢复数据。 6. 学习Redis的事务和Lua脚本:了解Redis事务的基本概念和使用方法,以及如何使用Lua脚本来进行复杂的操作。 7. 深入了解Redis的性能优化和高可用方案:学习如何优化Redis的性能,包括配置调优、使用合适的数据结构、合理地使用缓存等。同时了解Redis的高可用方案,如主从复制、哨兵模式和集群模式。 8. 学习Redis与其他技术的结合:了解Redis如何与其他技术进行结合,如与Python、Java等编程语言的配合使用,以及与Spring、Django等框架的整合。 以上是学习Redis基础知识的一个思路,你可以根据自己的实际情况和需求进行学习和拓展。推荐参考一些经典的Redis教程和实战案例,通过实际操作和项目实践来提升自己的技能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值