一、redis是什么?
Redis(Remote Dictionary Server) 即远程字段服务。是一个使用 C 语言编写的,开源的(BSD许可)高性能非关系型(NoSQL)的键值对数据库。
二、为什么用redis?
主要从“高性能”和“高并发”这两点来看待这个问题。
假如用户第一次访问数据库中的某些数据。这个过程会比较慢,因为是从硬盘上读取的。将该用户访问的数据存在数缓存中,这样下一次再访问这些数据的时候就可以直接从缓存中获取了。操作缓存就是直接操作内存,所以速度相当快。如果数据库中的对应数据改变的之后,同步改变缓存中相应的数据即可!
直接操作缓存能够承受的请求是远远大于直接访问数据库的,所以我们可以考虑把数据库中的部分数据转移到缓存中去,这样用户的一部分请求会直接到缓存这里而不用经过数据库。
三、redis的优缺点
优点:
缺点:
四、redis为什么那么快?
五、安装使用以及性能测试
1、安装推荐Linux下
2、修改redis配置文件
3、启动redis-server服务
4、进行redis 性能的测试
Redis 性能测试是通过同时执行多个命令实现的。
语法:
redis-benchmark [option] [option value]
注意:该命令是在 redis 的目录下执行的,而不是 redis 客户端的内部指令。
举例:测试100个并发连接 100000万请求
redis-benchmark -h localhost -p 6379 -c 100 -n 100000
redis 性能测试工具可选参数如下所示:
六、redis的基本操作
1、redis默认有16个数据库,可以在配置文件redis.conf 中看到 databases 16
.
2、redis 默认使用第0个,可以使用 select
命令进行数据库的切换。
3、redis数据库基本命令
dbsize
keys *
flushdb
flushall
七、基本命令操作
官方文档:http://www.redis.cn/commands.html#generic
dev_xsea:0>select 1 #切换数据库 "OK" dev_xsea:1>set bbb qwert #设置key "OK" dev_xsea:1>get bbb #获取key "qwert" dev_xsea:1>keys * #查看当前库中的所有的key 1) "bbb" dev_xsea:1>del bbb #删除key "1" dev_xsea:1>dump ccc #序列化给定 key ,并返回被序列化的值 "\x00\x04type\x08\x00\x9B\xA3>V\x9B|\xA0\xAD" dev_xsea:1>exists ccc #检查给定 key 是否存在。 "1" dev_xsea:1>expire aaa 10 #为给定 key 设置过期时间,以秒计。 "1" dev_xsea:1>expireat ddd 1293840000 #EXPIREAT 的作用和 EXPIRE 类似,都用于为 key 设置过期时间。 不同在于 EXPIREAT 命令接受的时间参数是 UNIX 时间戳(unix timestamp) "1" dev_xsea:1>pexpire aaa 1500 #设置 key 的过期时间以毫秒计。 "1" dev_xsea:1>pexpireat bbb 1555555555005 #设置 key 过期时间的时间戳(unix timestamp) 以毫秒计 "1" dev_xsea:1>move ddd 2 #将当前数据库的 key 移动到给定的数据库 db 当中。 "1" dev_xsea:1>type eee # 返回key的类型 "string" dev_xsea:1>renamenx eee aaa #如果存在key改名 "1" dev_xsea:1>randomkey #返回一个随机的key "aaa" dev_xsea:1>ttl aaa #以秒为单位,返回给定 key 的剩余生存时间(TTL, time to live)。"-1" dev_xsea:1>pttl aaa #以毫秒为单位返回 key 的剩余的过期时间。 "-1" dev_xsea:1>rename fff bbb #修改key的名称 "OK" dev_xsea:1>persist key #移除 key 的过期时间,key 将持久保持。 "0" dev_xsea:1>scan 0 #迭代数据库中的数据库键。 1) "0" 2) 1) "bbb" 2) "ccc" 3) "aaa"
八、redis数据类型
1、字符串(strings)
append [key] [value]:在对应的key中追加字符串,如果当前key不存在就相当于set一个key strlen [key] :获取对应key值得长度 incr [key] :自加1(i++) decr [key] : 自减1(i—) incrby [key] [value]:设置步长,自定义增量 decrby [key] [value]:设置步长,自定义减量 getrange [key] start end :截取字符串 setrange [key] offset value:设置替换的字符串的值 setex (set with expire) :设置过期时间 setnx (set if not exists) :不存在设置 mset key value [key value ….]:可以一次性设置多个key-value mget key [key …] :可以一次性获得多个key值 msetnx key value [key value …]:如果key值不存在设置key值如果存在设置失败,是个原子性(atomicity)的操作,要么一起成功要么一起失败! set user:1{name:zhangsan,age:3}:设置一个user:1对象 值为json字符串俩保存一个对象 这里的key是一个巧妙的设计: user:{id}:{filed},如此设计在redis中是完全ok了! getset [key] [value] #先get再set
应用场景:
2、 散列(hashes)
hset key field value :向hash中添加一个map hget key field:通过hash对应的field字段获取值 hmset key field value:向hash中set多个值 hmget key field [field2 …..]:获取多个值 hgetall key:获取hash中所有的值 hdel key field :删除指定的字段,对应的value也会被删除 hlen key:查看当前hash中的键值对个数 hexists key field:查看当前hash 的指定字段是否存在 hkeys key:获得所有的key值 hvals key:获得所有的value值 hincr key field value:对某个field值增长 hdecr key field value:对某个field值减少 hsetnx key field value:判断field是否存在如果存在,则执行失败,不存在创建 hash变更数据,尤其是用户信息之类的信息,hash更适合存储对象
3、列表(lists)
lpush key element:设置list的元素,从头部push值 rpush key element :设置list元素,从尾部push值 lrange key [起始元素下标] [结束元素下标,-1代表最后一个元素]移除一个元素 lpop:从左边开始移除第一个元素 rpop:从右边开始移除第一个元素 lindex:通过下标获取list的值 llen:返回list的长度 lrem key count elemnt:移除指定数量的list元素 ltrim [list name] [start] [stop]:通过下标截取元素 rpoplpush source destination:把reource元素的最后一个值移动到新的列表中 lset key index element :向元素中指定下标设置一个值,更新指定的值 linsert key before|after privo value:在指定的元素前面或者后面添加一个新的值
应用场景:
总结:
他实际上是一个链表,before node after ,left right 都可以插入
如果key不存在,创建新的链表
如果key存在新增元素
如果移除所有值,空链表也代表不存在
在两边插入或者改动值,效率最高,中间元素相对效率较低
4、 集合(sets)
sadd key member [member]:添加一个集合 smembers key:查看具体set集合的成员 sismember key member:判断集合中是否存在指定成员。 scard key:查看set的成员数量 srem key member:移除set中的指定成员 srandmember key [count]:随机抽取出[count]个成员 spop key:随机移除一个成员 smove source destination member:移动某个成员到另一个集合中 sdiff key [key1]:集合不同的成员,以第一个集合为基准(差集) sinter key [key2….]:集合相同的成员(交集) sunion key [key2…]:集合的并集(并集)
5、有序集合(sorted sets)
zadd key (key-value):新增一个有序集合,可以指定集合的排序 zrange key start end :获得zset的指定区间 zrangebyscore key min max [withscores]:给集合排序 -inf(负无穷),+(正无穷),withscores显示对应的score数 zrevrangebyscore key max min [withscores]:集合的倒序排序 zrem key member [member …]:移除指定的值 zcard key:查看集合中的数量 zcount key min max :获取指定区间的值
6、 bitmaps
setbit key offset value:value只能存储0或者1两种状态 getbit key offset:通过key-value取出对应的状态信息 bitcount key [start end]:通过key来统计非0的数量
7、 hyperloglogs
pfadd key member [member ….]:向hyper中添加一些数据成员 pfcount key [key…]:获得hyper中的成员数量,重复的成员不会统计 pfmerge key destkey sourcekey [sourcekey…]:将多个几个合并成一个新的集合
8、地理空间(geospatial)
geoadd key longitude(经度) latitude(纬度) member:用来存储位置信息 geopos key member [member…]:获取某个成员的经度纬度 geodist key member1 member2 [m|km|ft|mi]:
geohash : 该命令将返回11个字符的Geohash字符串,所以没有精度Geohash,损失相比,使用内部52位表示。
georadius key longitude latitude radius m|mk|mi|ft [withcoord] [withdist] [withhash] [count count] [asc|desc] [s:以给定的经度纬度为中心,找出某一半径的成员
WITHDIST: 在返回位置元素的同时, 将位置元素与中心之间的距离也一并返回。 距离的单位和用户给定的范围单位保持一致。
WITHCOORD: 将位置元素的经度和维度也一并返回。
WITHHASH: 以 52 位有符号整数的形式, 返回位置元素经过原始 geohash 编码的有序集合分值。 这个选项主要用于底层应用或者调试, 实际中的作用并不大。
命令默认返回未排序的位置元素。 通过以下两个参数, 用户可以指定被返回位置元素的排序方式:
ASC: 根据中心的位置, 按照从近到远的方式返回位置元素。
DESC: 根据中心的位置, 按照从远到近的方式返回位置元素。
在默认情况下, GEORADIUS 命令会返回所有匹配的位置元素。 虽然用户可以使用 COUNT `` 选项去获取前 N 个匹配元素, 但是因为命令在内部可能会需要对所有被匹配的元素进行处理, 所以在对一个非常大的区域进行搜索时, 即使只使用 COUNT 选项去获取少量元素, 命令的执行速度也可能会非常慢。 但是从另一方面来说, 使用 COUNT 选项去减少需要返回的元素数量, 对于减少带宽来说仍然是非常有用的
georadiusbymember:给指定的某个成员,找出方圆radius里的成员。 GEO底层的实现原理其实就是Zset!我们可以使用zset命令来操作geo! zrange key start end :查看集合某范围的成员 zrem key member:来移除一些成员