Redis基础+压力测试

本文介绍了Redis作为开源的内存数据结构存储系统,其支持的数据类型、高级功能如复制、Lua脚本和持久化策略,以及从单线程到Redis6.0的多线程引入以应对高并发。同时,文中提到了Redis的性能测试工具redis-benchmark。
摘要由CSDN通过智能技术生成

基础知识

Redis是一个开源( BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件MQ,它支持多种类型的数据结构,如字符串(strings) ,散列(hashes) ,列表(lists) ,集合(sets) ,有序集合(sorted sets)与范围查询,bitmaps,hyperloglogs和地理空间( geospatial )索引半径查询。Redis内置了复制(replication),LUA脚本(Luascripting),LRU驱动事件( LRU eviction ),事务(transactions )和不同级别的磁盘持久化( persistence ),并通过Redis哨兵(Sentinel )和自动分区( Cluster )提供高可用性( high availability ) 。

redis用C语言写的,默认有16个数据库,默认使用第0个数据库。

切换数据库命令:select 第几个数据库;
清除当前数据库数据:flashdb
清除所有数据库数据:flashall

注:redis命令不区分大小写

五大数据类型

  • Redis-Key
    keys *:查看所有的key
    exists name:判断key是否存在 1:存在;0:不存在
    move name 1:移除当前key
    expire name 5:设置过期时间,秒
    ttl name:查看当前key的剩余时间
    type name:查看当前key的类型
  • String
    append name “zhangsan”:追加字符串;若key不存在,相当于set key
    strlen name:获取字符串的长度
    incr age:自增1
    decr age:自减1
    incrby age 10:步长为10的自增
    decrby age 10:步长为10的自减
    getrange name 2 3:若有name为zhangsan,则输出an;若区间为0到-1,输出整个字符串
    setrange name 1 xx:若有name为zhangsan,则输出zxxngsan
    setex name 5 “zhangsan”:设置字符串的值并设置过期时间
    setnx name “zhangsan”:不存在该key再设置key
    mset name “张三” sex “男”:同时设置多个值
    mget name age:同时获取多个值
    msetnx name “张三” sex “男”:原子性,一起成功或一起失败
    getset name “zhangsan”:若没name,输出null;若有name,先获取后赋新值使用场景:计数器:文章阅读量,incr
  • List
    lpush namelist “zhangsan”:把值插入列表头部
    rpush namelist “zhangsan”:把值插入列表尾部
    lrange namelist 0 -1:获取列表所有的值
    lpop namelist:移除列表第一个值
    rpop namelist:移除列表最后一个值
    lindex namelist 0:获取列表该索引处的值
    len namelist:获取列表长度
    lrem namelist 1 zhangsan:移除列表指定个数的value,精确匹配
    ltrim namelist 1 2:若有namelist值为a、b、c、d;输出b、c
    rpoplpush list1 list2:若list1值为a、b、c、d;执行rpoplpush list1 list2后,list1值为a、b、c;list2值为d
    lset namelist 0 lisi:把列表的第一个值替换成lisi,更新操作
    linsert namelist before/after a b:把b插入a的前面或后面list其实是一个双向列表,总两边插入或更新效率最高
    使用场景:消息队列,lpush rpop 左进右出
  • Set
    set是无序不重复集合sadd nameset zhangsan:集合添加元素
    smembers nameset:查看该集合的元素
    sissmembers nameset zhangsan :判断zhangsan是否在集合中
    scard nameset:查看集合的元素的个数
    srem nameset zhangsan:移除集合中指定元素
    srandmember nameset 2:随机抽取集合中指定个数的元素,不写数量默认为1
    spop nameset 2:随机删除集合中指定个数的元素。数字参数在 3.2+ 版本可用。
    smove set1 set2 a:若set1元素为a、b,set2元素为c;执行命令后,set1元素为b,set2元素为a、c
    sdiff set1 set2:差集
    sinsert set1 set2:交集
    sunion set1 set2:并集使用场景:共同好友、共同关注、共同爱好、推荐好友 sinsert
  • Hash
    hset namehash filed1 zhangsan:set一个key-valuehget namehash filed1:获取该哈希filed1对应的值hset namehash filed1 a filed2 b:set多个key-valuehget namehash filed1 filed2:获取多个值hgetall namehash:获取全部值hdel namehash filed1:删除hash指定键值hlen namehash:获取哈希表的长度hexists namehash filed1:判断该哈希是否含该键hkeys namehash:获取所有的keyhvals namehash:获取所有的valuehincrby、hsetnx:用法和String一样
  • ZSet
    有序集合zdd nameset 1 a:添加值zdd nameset 1 a 2 b:添加多个值zrange nameset 0 -1:获取值排序:若zdd nameset 1 a 2 b 3 c:zrangebyscore nameset -inf +inf:显示所有元素,升序zrangebyscore nameset -1 0:显示所有元素,升序zrerange nameset +inf -inf:显示所有元素,降序zrerange nameset 0 -1:显示所有元素,降序zrangebyscore nameset -inf +inf withscores:显示所有元素,升序,带分数zrem nameset zhangsan:移除集合中指定的元素zcard nameset:获取集合个数zcount nameset 1 5:获取指定分数区间内的元素使用场景:成绩表、工资表等排序权重:1为重要消息,2为次要消息,3为普通消息排行榜

Redis线程

  • 6.0之前:
    官方表示,redis是基于内存操作,所以CPU不是redis的瓶颈,redis的瓶颈是机器的内存和网络的带宽,所以能用单线程就用单线程了。:多线程可能会导致 上下文切换(耗时),效率不一定比单线程高redis将数据放到内存中,所以说单线程效率是最高的,对于内存来说,没有上下文切换效率就是最高的
  • 6.0之后:
    redis6.0引入了多线程。原因:在更大的QPS(每秒请求数)下,多线程任务可以分摊 Redis 同步 IO 读写负荷。Redis6.0的多线程默认是禁用的,只使用主线程。需开启需要修改redis.conf配置文件的io-threads-do-reads改为yes。开启多线程后,还需要设置线程数,否则是不生效的,修改redis.conf配置文件的io-threads,官方的建议:4核的机器建议设置为2或3个线程,8核的建议设置为6个线程,线程数一定要小于机器核数。

压力测试

redis-benchmark:redis自带的性能测试工具


压测命令:redis-benchmark -h 127.0.0.1 -p 6379 -c 50 -n 10000

接下来测试一下50万并发:

  • 8
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值