Redis入门
1.Redis安装:
1).官网下载Redis安装包
2).将安装包传到Linux系统
3).将安装包拷贝到 /opt
4).解压并进入解压后目录
5).执行make
,再执行make install
6).切换到/usr/local/bin
目录下
7).拷贝Redis的配置文件(redis.conf)到当前目录下
8).修改配置文件
9).启动Redis的服务器 执行命令 ./redis-server redis.conf
10).启动Redis的客户端 执行命令 ./redis-cli -p 6379
11).测试是否连接上Redis的服务器 执行命令 ping
至此,Redis已经安装完毕并可以使用。
2.Redis的基本概念
Redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
Redis 是一个高性能的key-value数据库。 redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部 分场合可以对关系数据库起到很好的补充作用。它提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang等客户端,使用很方便。
Redis支持主从同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。这使得Redis可执行单层树复制。存盘可以有意无意的对数据进行写操作。由于完全实现了发布/订阅机制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布记录。同步对读取操作的可扩展性和数据冗余很有帮助。
3.Redis基本操作
Redis默认有16个数据库,默认使用的是第0个数据库,可以通过select切换数据库。
Redis对于大小写不区分。
1).select
作用:切换数据库
格式:select index
2).dasize
作用:查看数据大小
格式:dbsize
3).keys
作用:查看所有key
格式:keys *
127.0.0.1:6379[3]> KEYS * #查看所有的key
1) "name"
2) "age"
4).flushdb flushall
作用:
flushdb :清空当前数据库
flushall:清空所有数据库
127.0.0.1:6379[3]> FLUSHDB #清空当前数据库
OK
127.0.0.1:6379[3]> KEYS *
(empty array)
127.0.0.1:6379[3]> FLUSHALL #清空所有的数据库
OK
4.Redis是单线程的
Redis是很快的,官方表示,Redis是基于内存操作的,CPU不是Redis的性能瓶颈,Redis的瓶颈就是根据机器的内存和网络带宽。既然可以使用单线程来实现,就使用单线程了!
Redis是C语言实现的,官方数据:读:110000/s 写: 80000/s,完全不比同样使用key-value的Memcached差
1).Redis为什么单线程还这么快?
错误1: 高性能的服务器一定是多线程的
错误2: 多线程(CPU上下文切换)一定比单线程效率高
核心: Redis是将所有的数据全部放在内存中的,所以说使用单线程去操作效率就是最高的,相比多线程,减少了CPU上下文切换的耗时。对于内存系统来说,没有上下文切换效率就是最高的,多次读写都是在一个CPU上的。
5.Redis的五种基本类型
1).Redis-key
# SET 设置key
# GET 查看key的值
# EXPIRE 设置key的过期时间
# TTL 查看key剩余的时间
# EXISTS 判断当前的key是否存在
# KEYS * 查看当前所有的key
# DEL key 删除当前的key
# TYPE 查看key存储的value的类型
2).string字符串
set
和get
作用:设置值以及获取值
格式: set key value
get key
127.0.0.1:6379> set key1 v1 #设置值
OK
127.0.0.1:6379> get key1 #获得值
"v1"
exists
作用:判断key是否存在
格式:exists key
127.0.0.1:6379> EXISTS key1 #判断key是否存在
(integer) 1
append
作用:追加字符串,if key不存在,相当于set命令
格式:append key value
127.0.0.1:6379> APPEND key1 hello #追加字符串,如果当前key不存在,相当于set命名
(integer) 7
127.0.0.1:6379> get key1
"v1hello"
strlen
作用:获取字符串长度
格式:strlen key
127.0.0.1:6379> STRLEN key1 #获得字符串的长度 (integer) 7
127.0.0.1:6379> append key1 wang
(integer) 11
127.0.0.1:6379> strlen key1
(integer) 11
127.0.0.1:6379> get key1
"v1hellowang"
incr
和 decr
作用:对value进行自增1和自减1操作
格式: incr key
decr key
127.0.0.1:6379> set views 0
OK
127.0.0.1:6379> get views
"0"
127.0.0.1:6379> INCR views # i++操作
(integer) 1
127.0.0.1:6379> INCR views
(integer) 2
127.0.0.1:6379> get views
"2"
127.0.0.1:6379> DECR views # i--操作
(integer) 1
127.0.0.1:6379> get views
"1"
127.0.0.1:6379> DECR views
(integer) 0
127.0.0.1:6379> get views
"0"
incrby
和decrby
作用:设置加减的步长
用法: incrby key num
decrby key num
127.0.0.1:6379> INCRBY views 10 # 设置自增的步长 (integer) 10
127.0.0.1:6379> INCRBY views 10
(integer) 20
127.0.0.1:6379> get views
"20"
127.0.0.1:6379> DECRBY views 5 # 设置自减的步长 (integer) 15
127.0.0.1:6379> DECRBY views 5
(integer) 10
127.0.0.1:6379> get views
"10"
getrange
作用:获取给定范围字符串值
格式:getrange key start stop
127.0.0.1:6379> set key1 hello,wang
OK
127.0.0.1:6379> get key1
"hello,wang"
127.0.0.1:6379> GETRANGE key1 0 3 # 查看给定范围的字符串
"hell"
127.0.0.1:6379> GETRANGE key1 0 -1 #类似于get命令,查看所有的字符串
"hello,wang"
setrange
作用:从指定位置开始替换字符串的值
格式:setrange key offset value
127.0.0.1:6379> GETRANGE key1 0 -1
"hello,wang"
127.0.0.1:6379> SETRANGE key1 2 xxx # 替换指定位置开始的字符串
(integer) 10
127.0.0.1:6379> GETRANGE key1 0 -1
"hexxx,wang"
setex
和ttl
作用:设置过期时间,查看剩余时间
格式:setex key seconds value
ttl key
127.0.0.1:6379> setex key2 30 v2
OK
127.0.0.1:6379> TTL key2
(integer) 21
127.0.0.1:6379> TTL key2
(integer) 20
127.0.0.1:6379> TTL key2
(integer) 18
setnx
作用:如果key不存在则设置,否则失败
格式:setnx key value
#setnx 如果当前值不存在,则设置 (在分布式锁中经常使用) 127.0.0.1:6379> setnx mykey redis #如果值不存在,则创建成功
OK
127.0.0.1:6379> get mykey
"redis"
127.0.0.1:6379> setnx mykey mongodb #如果值存在,则创建失败
(integer) 0
127.0.0.1:6379> get mykey
"redis"
mset
和 mget
作用:同时设置或者获取多个值
格式:mset key1 value1 key2 value2 ...
mget key1 key2...
127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> mset key1 v1 key2 v2 key3 v3 #同时设置多个值
OK
127.0.0.1:6379> keys *
1) "key3"
2) "key2"
3) "key1"
127.0.0.1:6379> mget key1 key2 key3 #同时获取多个值
1) "v1"
2) "v2"
3) "v3"
msetnx
作用:msetnx是一个原子操作,要么一起成功,要么一起失败
127.0.0.1:6379> msetnx key1 v1 key4 v4 #msetnx是一个原子操作,要么一起成功,要么一起失败
(integer) 0
127.0.0.1:6379> get key4
(nil)
用string存储对象时key值的设计
#对象
set user:1 {name:zhangsan, age:20} #设置一个user:1对象 值为Json字符串
#这里的key是一个巧妙的设计: user:{id}:{filed} 127.0.0.1:6379> mset user:1:name zhangsan user:1:age 20
OK
127.0.0.1:6379> mget user:1:name user:1:age
1) "zhangsan"
2) "20"
getset
作用:先获取值再设置值
格式:getset key value
#getset 先get在set
127.0.0.1:6379> getset db redis #如果不存在,则返回nil
(nil)
127.0.0.1:6379> get db
"redis"
127.0.0.1:6379> getset db mongodb #如果存在,获取原来的值,并设置新的值
"redis"
127.0.0.1:6379> get db
"mongodb"
小结:
String类似的使用场景:value除了是字符串也可以是数字!
(1) 计数器
(2)统计多单位的数量
(3)对象缓存存储