มาทำความรู้จักกับ Redis

แนะนำ สอบถาม ภาษา C สำหรับผู้เริ่มต้น ภาษา Java ภาษา Python

Moderators: mindphp, ผู้ดูแลกระดาน

thitikorn_lp
PHP Super Hero Member
PHP Super Hero Member
Posts: 680
Joined: 28/07/2014 10:24 am

มาทำความรู้จักกับ Redis

Post by thitikorn_lp »

Redis คืออะไร?
  Redis เป็นระบบฐานข้อมูลแบบ key-value ประเภทหนึ่งของ NoSQL ที่จะทำการบันทึกค่าข้อมูลต่างๆ ลงใน storage
โดย "รูปแบบของข้อมูล" ที่ Redis ยอมรับให้บันทึกมีดังนี้
String
  • การเก็บข้อมูลแบบ string ใน redis จะ default มาเป็นแบบ Binary safe คือ ไม่ว่า value ที่จัดเก็บจะเข้าไปยังไงหน้าตาแบบไหน เวลาเรียกออกมาก็จะมีหน้าตาเหมือนตอนที่เข้าไป
List
  • การเรียงลำดับตามความสำคัญ เช่นการเก็บข้อความก่อน - หลัง คล้ายๆ กับการเข้าคิว
Set
  • set จะเก็บข้อมูลเป็นกลุ่มๆ คล้ายๆ list แต่ set จะไม่สนใจว่าอะไรเข้าก่อน หรือเข้าทีหลัง และ set จะไม่เก็บข้อมูลที่ซ้ำกัน เมื่อเก็บข้อมูลซ้ำกันเข้ามากี่ตัว set ก็จะนับเป็น 1 ตัวเท่านั้น เราจะไม่ต้องเสียเวลาเช็คว่าข้อมูลซ้ำหรือไม่
Hashes
  • เป็นการเก็บข้อมูลที่ถูกเรียกใช้งานมากที่สุด โดยจะเก็บข้อมูลได้หลากหลาย คล้ายกับ row ใน MySQL คือเก็บข้อมูลต่อๆ กันได้ยาวๆ ในคราวเดียว เช่น สร้าง Key ขึ้นมาแล้วเก็บ ชื่อนามสกุล:เพศ:อายุ เป็นต้น เมื่อเวลาเรียกใช้งานจะง่าย โดยสามารถเรียกมาทั้งหมดในครั้งเดียว หรือเลือกให้มาแสดงแค่เพียงบางข้อมูลก็ได้
Sorted sets
  • เป็บการเก็บข้อมูลที่คล้ายกับ set แต่สามารถเรียงลำดับและเก็บค่าซ้ำได้ และมีการตอบสนองที่รวดเร็ว
[list]คำศัพท์
key-value :: การตั้งชื่อ (key) และการกำหนดค่าให้มัน(value) การสร้าง key เก็บ value ไว้ เมื่อต้องการเรียกใช้ก็นำ key ไปดึง value ที่เก็บไว้ออกมาใช้
NoSQL :: คือ database ที่ไม่มีความสัมพันธ์ เน้นการใช้งานในปริมาณที่มากและรวดเร็ว โดยไม่ต้องมาเสียเวลาในการ SELECT .. FROM .. WHERE หรือ JOIN ให้ยุ่งยาก[/list]

  ใครบ้างที่ใช้งาน Redis? ตัวอย่างเช่น
  • • Twitter         •Github         •Flickr
    • Weibo          •Pinterest
    • Snapchat       •Craigslist
    • Digg           •StackOverflow
                                    อ่านเพิ่มเติมได้ที่ :: Redis หรือ เจาะลึก database noSQL redis

» การติดตั้ง Redis กับ Python
» การใช้งาน Redis
» ตัวอย่างใช้งาน Redis ร่วมกับ Werkzeug
Last edited by thitikorn_lp on 26/09/2014 3:48 pm, edited 2 times in total.
Image

thitikorn_lp
PHP Super Hero Member
PHP Super Hero Member
Posts: 680
Joined: 28/07/2014 10:24 am

Re: มาทำความรู้จักกับ Redis

Post by thitikorn_lp »

การติดตั้ง Redis กับ Python
>> ก่อนอื่นต้องมีตัว easy_install ก่อน | สามารถดาวน์โหลดได้ที่นี้ (Python 2.7.8.),( Python 3.4.1)
• ทำการติดตั้งโดยผ่าน Command Prompt
-- เปิด Command Prompt (พิมพ์ cmd ในช่องค้นหาที่ start menu)
-- เข้าไปที่โฟล์เดอร์ของ python ที่ติดตั้งไว้ > เข้าไปใน scripts > ทำการติดตั้ง redis
>> C:\Python27\Scripts> easy_install redis
2014-09-26_14-40-03.jpg
2014-09-26_14-40-03.jpg (5.85 KiB) Viewed 1892 times
เมื่อติดตั้งเสร็จจะแสดงข้อความดังนี้
2014-09-26_14-42-31.jpg
2014-09-26_14-42-31.jpg (16.46 KiB) Viewed 1892 times
Image

thitikorn_lp
PHP Super Hero Member
PHP Super Hero Member
Posts: 680
Joined: 28/07/2014 10:24 am

Re: มาทำความรู้จักกับ Redis

Post by thitikorn_lp »

การใช้งาน Redis
เมื่อเราต้องการใช้งาน Redis ก่อนอื่นต้องทำการโหลดตัว Redis (โหลดที่นี่) มาเก็บไว้ในเครื่องก่อน
2014-09-23_15-18-03.jpg
2014-09-23_15-18-03.jpg (146.96 KiB) Viewed 1892 times
2014-09-23_15-51-09.jpg
2014-09-23_15-51-09.jpg (142.39 KiB) Viewed 1878 times
จะได้เป็นไฟล์ zip มา ให้ทำการแตกไฟล์ เมื่อแตกไฟล์เรียบร้อยจะต้องการให้ redis ให้ทำงาน สามารถทำตามขั้นตอนได้ดังนี้
แตกไฟล์ > เปิดโฟล์เดอร์ของ redis ที่โหลดมา จะได้
redis-2.6 > bin > release จะเจอไฟล์ zip ที่ชื่อว่า
  • - redisbin.zip (สำหรับ 32 bit) และ
    - redisbin64.zip (สำหรับ 64 bit)
ในที่นี้จะเลือก redisbin64.zip (สำหรับ 64 bit) หลังจากนั้นดับเบิ้ลคลิกเข้าไป จะพบหน้าตาแบบในภาพที่ 3
2014-09-26_11-24-09.jpg
2014-09-26_11-24-09.jpg (103.47 KiB) Viewed 1892 times
เมื่อทำการดับเบิ้ลคลิกที่ตัว redis-server.exe แล้ว จะได้หน้าต่างหน้าตาดังในรูปที่ 4
2014-09-26_11-24-48.jpg
2014-09-26_11-24-48.jpg (82.36 KiB) Viewed 1892 times
The attachment 2014-09-26_11-24-48.jpg is no longer available
เป็นอันเสร็จเรียบร้อยสำหรับการเปิดให้ Redis ทำงาน
Image

thitikorn_lp
PHP Super Hero Member
PHP Super Hero Member
Posts: 680
Joined: 28/07/2014 10:24 am

Re: มาทำความรู้จักกับ Redis

Post by thitikorn_lp »

ตัวอย่างใช้งาน Redis ร่วมกับ Werkzeug
  Werkzeug เป็น WSGI ของ python
หากยังไม่ได้ติดตั้ง Werkzeug ต้องทำการติดตั้งก่อน โดยโหลด Werkzeug (โหลดที่นี่)
ทำการติดตั้งด้วย easy_install เหมือน redis
>> C:\Python27\Scripts> easy_install Werkzeug
อ้างอิง :: Werkzeug Tutorial
ตัวอย่างจะเป็นการทำ url ของเว็บให้สั้นลงอย่างง่าย โดยใช้ redis และ werkzeug ให้มีการเพิ่มการบันทึกลงฐานข้อมูลและแสดงผลจากฐานข้อมูลออกไปโดย
1. สร้างโฟล์เดอร์ที่จำเป็นสำหรับการส้ราง shortly นี้ ตามตัวอย่างคือ
2014-09-29_2-13-11.jpg
2014-09-29_2-13-11.jpg (7.11 KiB) Viewed 1883 times
  • /shortly
    • /static
      /templates
นี่เป็นเพียง Folder ที่ใช้เพื่อเก็บ Code และ Template เท่านั้น
ตัวอย่างไฟล์ html ที่สร้างไว้ใน template
2014-09-29_10-19-20.jpg
2014-09-29_10-19-20.jpg (11.58 KiB) Viewed 1883 times
2. ต่อไปเป็นการสร้างไฟล์ จะใช้ชื่อว่า shortly.py เก็บไว้ในโฟล์เดอร์ โดยทำการ import ตัว function หรือ method ที่จำเป็น
[code]import os
import redis
import urlparse
from werkzeug.wrappers import Request, Response
from werkzeug.routing import Map, Rule
from werkzeug.exceptions import HTTPException, NotFound
from werkzeug.wsgi import SharedDataMiddleware
from werkzeug.utils import redirect
from jinja2 import Environment, FileSystemLoader[/code]


3. สร้างฟังก์ชั่นสำหรับการเรียกใช้งาน
ฟังก์ชั่นสำหรับสร้างไอดีให้แก่ URL

Code: Select all

def base36_encode(number): 
    assert number >= 0, 'positive integer required'
    if number == 0:
        return '0'
    base36 = []
    while number != 0:
        number, i = divmod(number, 36)
        base36.append('0123456789abcdefghijklmnopqrstuvwxyz'[i])
    return ''.join(reversed(base36))
2014-09-29_2-31-09.jpg
2014-09-29_2-31-09.jpg (44.37 KiB) Viewed 1883 times
ฟังก์ชั่นสำหรับกำหนดว่า URL ที่ใส่ ก่อนทำให้เป็น Shortly นั้น ต้องมี 'http' หรือ 'https'

Code: Select all

def is_valid_url(url):
    parts = urlparse.urlparse(url)
    return parts.scheme in ('http', 'https')
2014-09-29_2-34-03.jpg
2014-09-29_2-34-03.jpg (34.99 KiB) Viewed 1883 times
2014-09-29_2-34-15.jpg
2014-09-29_2-34-15.jpg (40.47 KiB) Viewed 1883 times
ฟังก์ชั่นรับและส่งค่า URL

Code: Select all

def get_hostname(url):
    return urlparse.urlparse(url).netloc
คลาสสำหรับการเชื่อมต่อฐานข้อมูล Redis

Code: Select all

class Shortly(object):
    def __init__(self, config): 
        self.redis = redis.Redis(config['redis_host'], config['redis_port'])
        template_path = os.path.join(os.path.dirname(__file__), 'templates') 
"""ระบุตำแหน่งที่ไฟล์ Template อยู่ """
        self.jinja_env = Environment(loader=FileSystemLoader(template_path),
                                     autoescape=True)
        self.jinja_env.filters['hostname'] = get_hostname
"""กำหนดเส้นทางที่จะทำการเรียก Template ที่ต้องการ"""
        self.url_map = Map([
            Rule('/', endpoint='new_url'),
            Rule('/<short_id>', endpoint='follow_short_link'),
            Rule('/<short_id>+', endpoint='short_link_details')
        ])
2014-09-26_16-08-13.jpg
2014-09-26_16-08-13.jpg (97.7 KiB) Viewed 1883 times
ฟังก์ชั่นสำหรับการตรวจสอบ URL ว่าใส่ถูกต้องหรือไม่

Code: Select all

def on_new_url(self, request): 
        error = None
        url = ''
        if request.method == 'POST':
            url = request.form['url']
            if not is_valid_url(url):
                error = 'Please enter a valid URL'
            else:
                short_id = self.insert_url(url)
                return redirect('/%s+' % short_id)
        return self.render_template('new_url.html', error=error, url=url)
ฟังก์ชั่นสำหรับนับจำนวนครั้งในการกดเข้าไปที่ Shortly URL

Code: Select all

def on_follow_short_link(self, request, short_id):
        link_target = self.redis.get('url-target:' + short_id)
        if link_target is None:
            raise NotFound()
        self.redis.incr('click-count:' + short_id)
        return redirect(link_target)

def on_short_link_details(self, request, short_id):
        link_target = self.redis.get('url-target:' + short_id)
        if link_target is None:
            raise NotFound()
        click_count = int(self.redis.get('click-count:' + short_id) or 0)
        return self.render_template('short_link_details.html',
            link_target=link_target,
            short_id=short_id,
            click_count=click_count
        )
2014-09-26_16-08-57.jpg
2014-09-26_16-08-57.jpg (82.83 KiB) Viewed 1883 times
ฟังก์ชั่นเรียกหน้า templates เมื่อใส่ URL ที่ไม่ถูกต้อง จะแสดง ERROR 404 ขึ้นมา

Code: Select all

def error_404(self):
        response = self.render_template('404.html')
        response.status_code = 404
        return response
ฟังก์ชัน insert ค่าลงฐานข้อมูล Redis

Code: Select all

def insert_url(self, url):
        short_id = self.redis.get('reverse-url:' + url)
        if short_id is not None:
            return short_id
        url_num = self.redis.incr('last-url-id')
        short_id = base36_encode(url_num)
        self.redis.set('url-target:' + short_id, url)
        self.redis.set('reverse-url:' + url, short_id)
        return short_id

Code: Select all

   def render_template(self, template_name, **context):
        t = self.jinja_env.get_template(template_name)
        return Response(t.render(context), mimetype='text/html')
คืนค่า Response

Code: Select all

def dispatch_request(self, request):
        adapter = self.url_map.bind_to_environ(request.environ)
        try:
            endpoint, values = adapter.match()
            return getattr(self, 'on_' + endpoint)(request, **values)
        except NotFound, e:
            return self.error_404()
        except HTTPException, e:
            return e
รับ Request

Code: Select all

def wsgi_app(self, environ, start_response):
        request = Request(environ)
        response = self.dispatch_request(request)
        return response(environ, start_response)
ฟังก์ชันพิเศษไว้สำหรับใช้งาน start_response จาก Class

Code: Select all

    def __call__(self, environ, start_response):
        return self.wsgi_app(environ, start_response)
ฟังก์ชันทำหน้าที่เรียกใช้ Class

Code: Select all

def create_app(redis_host='localhost', redis_port=6379, with_static=True):
    app = Shortly({
        'redis_host':       redis_host,
        'redis_port':       redis_port
    })
    if with_static: """เรียกใช้ไฟล์ CSS ที่ในโฟลเดอร์ Static"""
        app.wsgi_app = SharedDataMiddleware(app.wsgi_app, {
            '/static':  os.path.join(os.path.dirname(__file__), 'static')
        })
    return app
การเรียกใช้งาน Appilication โดยรันขึ้น Server และให้มีการรีโหลดอัตโนมัติ

Code: Select all

if __name__ == '__main__':
    from werkzeug.serving import run_simple
    app = create_app()
    run_simple('127.0.0.1', 5009, app, use_debugger=True, use_reloader=True)
2014-09-29_10-23-42.jpg
2014-09-29_10-23-42.jpg (25.5 KiB) Viewed 1883 times
2014-09-26_16-07-45.jpg
2014-09-26_16-07-45.jpg (79.63 KiB) Viewed 1883 times
* Redis สามารถทำให้เชื่อมต่อกับฐานข้อมูลทั้ง MySQL และ PostgreSQL ได้อีกด้วย

ขอให้สนุกกับการนำ Redis ไปประยุกต์ใช้นะคะ
Image

thitikorn_lp
PHP Super Hero Member
PHP Super Hero Member
Posts: 680
Joined: 28/07/2014 10:24 am

Re: มาทำความรู้จักกับ Redis

Post by thitikorn_lp »

* Redis สามารถนำไปใช้ได้เหมือนกับฐานข้อมูลอื่นๆ เช่น MySQL และ PostgreSQL ค่ะ
* สามารถใช้ได้กับ Werkzeug / Django ค่ะ

ปล. ผู้เขียนต้องขออภัยในความผิดพลาดก่อนหน้านี้ด้วยค่ะ :cry:
Image

Post Reply
  • Similar Topics
    Replies
    Views
    Last post

Return to “Programming - C/C++ & java & Python”

Who is online

Users browsing this forum: No registered users and 4 guests