Redis入门

Redis入门

1.Redis安装:

1).官网下载Redis安装包

Redis安装包下载
Redis入门

2).将安装包传到Linux系统

3).将安装包拷贝到 /opt

4).解压并进入解压后目录

5).执行make,再执行make install

6).切换到/usr/local/bin目录下

Redis入门

7).拷贝Redis的配置文件(redis.conf)到当前目录下

8).修改配置文件

Redis入门

9).启动Redis的服务器 执行命令 ./redis-server redis.conf

10).启动Redis的客户端 执行命令 ./redis-cli -p 6379

11).测试是否连接上Redis的服务器 执行命令 ping

Redis入门
至此,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
Redis入门

2).dasize

作用:查看数据大小
格式:dbsize
Redis入门

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字符串

setget
作用:设置值以及获取值
格式: 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"

incrdecr
作用:对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"

incrbydecrby
作用:设置加减的步长
用法: 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"

setexttl
作用:设置过期时间,查看剩余时间
格式: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"

msetmget
作用:同时设置或者获取多个值
格式: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)对象缓存存储

上一篇:.NET redis 客户端开源组件 FreeRedis (继 CSRedisCore 之后重写)


下一篇:Mysql索引