Redis :是完全开源免费的,遵守BSD协议,是一个高性能(NOSQL)的key-value数据库,Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
Redis特点:
1.性能极高 :Redis能读的速度是110000次/s,写的速度是81000次/s 。
2.数据类型丰富:Redis支持String,Hash,List,Set 及 Ordered Set 数据类型操作。
3.原子性:其所有的操作都是有原子性的。
4.丰富的特性:Redis还支持 publish/subscribe, 通知, key 过期等等特性。
5.高速读写:redis使用自己实现的分离器,代码量很短,没有使用lock(MySQL),因此效率非常高。
总结:
Redis:是一个简单的,高效的,分布式的,基于内存的缓存工具。
架设好服务器后,通过网络连接(类似数据库),提供Key-Value式缓存服务。
简单,是Redis突出的特色。
简单可以保证核心功能的稳定和优异。
Redis的应用场景
企业级开发中:
可以用作数据库、缓存、热点数据(经常会被查询,但是不经常被修改或者删除的数据)
和消息中间件等大部分功能。
redis常用的场景:
1、缓存 2、排行榜 3、计数器 4、分布式会话 5、分布式锁 6、 社交网络 7、最新列表
Redis 缺点:
持久化:Redis直接将数据存储导内存中,要将数据保存导磁盘上,有两种方法实现:(1)定时快照:每个一段时间将整个数据库写到磁盘上,每次均写是写全部数据,代价非常高。(2)基于语句追加:只追加变化的数据。但是追加的log可能过大,同时所有的操作均重新执行一遍,回复速度慢。
耗内存,占用内存过高。
redis数据结构:
1.字符串(strings)
strings类型是一个很基础的数据类型,也是任何存储系统都必备的数据类型。
set mystr "hello world!" //设置字符串类型
get mystr //读取字符串类型
字符串类型的用法就是这么简单,因为是二进制安全的,所以完全可以把一个图片文件的内容作为字符串来存储。
2.字符串列表(lists)
lists,翻译成中文叫做 “列表” redis中的lists在底层实现上并不是数组,而是链表,也就是说对于一个具有上百万个元素的lists来说,在头部和尾部插入一个新元素,其时间复杂度是常数级别的,比如用LPUSH在10个元素的lists头部插入新元素,和在上千万元素的lists头部插入新元素的速度应该是相同的。
应用:
1.我们可以利用lists来实现一个消息队列,而且可以确保先后顺序,不必像MySQL那样还需要通过ORDER BY来进行排序。
2.利用LRANGE还可以很方便的实现分页的功能。
3.在博客系统中,每片博文的评论也可以存入一个单独的list中。
3.字符串集合(sets)
sets:集合,是一种无序的集合,集合中的元素没有先后顺序。
集合相关的操作也很丰富,如添加新元素、删除已有元素、取交集、取并集、取差集等。
4.有序字符串集合(sorted sets)
sorted sets:有序集合中的每个元素都关联一个序号(score),这是排序的依据。
5.哈希(hashes)
hashes:即哈希。哈希是从redis-2.0.0版本之后才有的数据结构。hashes存的是字符串和字符串值之间的映射,比如一个用户要存储其全名、姓氏、年龄等等,就很适合使用哈希。
redis持久化:
redis提供了两种持久化的方式,分别是RDB(Redis DataBase)和AOF(Append Only File)。
RDB,简而言之,就是在不同的时间点,将redis存储的数据生成快照并存储到磁盘等介质上;
AOF,则是换了一个角度来实现持久化,那就是将redis执行过的所有写指令记录下来,在下次redis重新启动时,只要把这些写指令从前到后再重复执行一遍,就可以实现数据恢复了。
其实RDB和AOF两种方式也可以同时使用,在这种情况下,如果redis重启的话,则会优先采用AOF方式来进行数据恢复,这是因为AOF方式的数据恢复完整度更高。
如果你没有数据持久化的需求,也完全可以关闭RDB和AOF方式,这样的话,redis将变成一个纯内存数据库,就像memcache一样。
scala操作Redis:
Maven导包
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>
创建链接
val jedis = new Jedis("192.168.137.33", 6379)
//放值
jedis.set(k,v)
//取值
val str: String = jedis1.get(k)