Redis教程

redis入门教程

本文主要是介绍redis入门教程,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

一、redis是什么?

Redis(Remote Dictionary Server) 即远程字段服务。是一个使用 C 语言编写的,开源的(BSD许可)高性能非关系型(NoSQL)的键值对数据库。

二、为什么用redis?

主要从“高性能”和“高并发”这两点来看待这个问题。

  • 高性能

假如用户第一次访问数据库中的某些数据。这个过程会比较慢,因为是从硬盘上读取的。将该用户访问的数据存在数缓存中,这样下一次再访问这些数据的时候就可以直接从缓存中获取了。操作缓存就是直接操作内存,所以速度相当快。如果数据库中的对应数据改变的之后,同步改变缓存中相应的数据即可!

  • 高并发

直接操作缓存能够承受的请求是远远大于直接访问数据库的,所以我们可以考虑把数据库中的部分数据转移到缓存中去,这样用户的一部分请求会直接到缓存这里而不用经过数据库。

三、redis的优缺点

优点:

  • 读写性能优异, Redis能读的速度是110000次/s,写的速度是81000次/s。
  • 支持数据持久化,支持AOF和RDB两种持久化方式。
  • 支持事务,Redis的所有操作都是原子性的,同时Redis还支持对几个操作合并后的原子性执行。
  • 数据结构丰富,除了支持string类型的value外还支持hash、set、zset、list等数据结构。
  • 支持主从复制,主机会自动将数据同步到从机,可以进行读写分离。

缺点

  • 数据库容量受到物理内存的限制,不能用作海量数据的高性能读写,因此Redis适合的场景主要局限在较小数据量的高性能操作和运算上。
  • Redis 不具备自动容错和恢复功能,主机从机的宕机都会导致前端部分读写请求失败,需要等待机器重启或者手动切换前端的IP才能恢复。
  • 主机宕机,宕机前有部分数据未能及时同步到从机,切换IP后还会引入数据不一致的问题,降低了系统的可用性。
  • Redis 较难支持在线扩容,在集群容量达到上限时在线扩容会变得很复杂。为避免这一问题,运维人员在系统上线时必须确保有足够的空间,这对资源造成了很大的浪费。

四、redis为什么那么快?

  • 绝大部分请求是纯粹的内存操作(非常快速)
  • 采用单线程,避免了不必要的上下文切换和竞争条件
  • 非阻塞IO - IO多路复用**

五、安装使用以及性能测试

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
  • 查看当前库中所有的key
keys *
  • 清空当前库
flushdb
  • 清空所有的库
flushall

七、基本命令操作

官方文档:http://www.redis.cn/commands.html#generic

  • redis-keys
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:在指定的元素前面或者后面添加一个新的值

应用场景:

  • 消息队列(lpush rpop )
  • 栈(lpush lpop)
  • 阻塞队列

总结:
他实际上是一个链表,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:来移除一些成员
这篇关于redis入门教程的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!