Redis
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> Redis

Cách có thể mở rộng để ghi dữ liệu yêu cầu trang từ một ứng dụng PHP?

Nó chắc chắn có thể thực hiện được trong nhiều phương pháp. Tôi sẽ giải quyết từng tùy chọn được liệt kê cũng như một số bình luận bổ sung.

1) Nếu NGinx có thể làm được, hãy để nó. Tôi làm điều đó với Apache cũng như JBOSS và Tomcat. Sau đó, tôi sử dụng syslog-ng để thu thập chúng một cách tập trung và xử lý từ đó. Đối với lộ trình này, tôi đề xuất một định dạng thông báo nhật ký được phân tách chẳng hạn như được phân tách bằng tab vì nó giúp phân tích cú pháp và đọc dễ dàng hơn. Tôi không biết về việc nó ghi nhật ký các biến PHP, nhưng chắc chắn nó có thể ghi nhật ký các tiêu đề và thông tin cookie. Nếu bạn định sử dụng ghi nhật ký NGinx, tôi khuyên bạn nên sử dụng tuyến đường này nếu có thể - tại sao phải đăng nhập hai lần?

2) Không có "thiếu khả năng truy vấn ngày vào một ngày sau đó", hãy tìm hiểu thêm ở bên dưới.

3) Đây là một tùy chọn nhưng nó hữu ích hay không còn tùy thuộc vào việc bạn muốn giữ dữ liệu trong bao lâu và mức độ dọn dẹp mà bạn muốn ghi. Thêm bên dưới.

4) MongoDB chắc chắn có thể hoạt động. Bạn sẽ phải viết các truy vấn và chúng không phải là các lệnh SQL đơn giản.

Bây giờ, để lưu trữ dữ liệu trong redis. Tôi hiện ghi nhật ký mọi thứ bằng syslog-ng như đã lưu ý và sử dụng đích của chương trình để phân tích cú pháp dữ liệu và đưa nó vào Redis. Trong trường hợp của tôi, tôi có một số tiêu chí phân nhóm như theo vhost và theo cụm, vì vậy cấu trúc của tôi có thể hơi khác. Câu hỏi bạn cần giải quyết đầu tiên là "tôi muốn dữ liệu nào từ dữ liệu này"? Một số trong số đó sẽ là bộ đếm chẳng hạn như tỷ lệ lưu lượng truy cập. Một số trong số đó sẽ là tổng hợp, và nhiều hơn nữa sẽ là những thứ như "sắp xếp các trang của tôi theo mức độ phổ biến".

Tôi sẽ trình bày một số kỹ thuật để dễ dàng đưa điều này vào redis (và do đó trở lại).

Đầu tiên, chúng ta hãy xem xét số liệu thống kê về lưu lượng truy cập theo thời gian. Đầu tiên hãy quyết định về mức độ chi tiết. Bạn muốn số liệu thống kê theo phút hay số liệu thống kê theo giờ là đủ? Đây là một cách để theo dõi lưu lượng truy cập của một URL nhất định:

Lưu trữ dữ liệu trong một tập hợp được sắp xếp bằng cách sử dụng khóa "traffic-by-url:URL:YYYY-MM-DD" trong tập hợp được sắp xếp này, bạn sẽ sử dụng lệnh zincrby và cung cấp thành viên "HH:MM". ví dụ trong Python trong đó "r 'là kết nối redis của bạn:

r.zincrby("traffic-by-url:/foo.html:2011-05-18", "01:04",1)

Ví dụ này tăng bộ đếm cho url "/foo.html" vào ngày 18 tháng 5 lúc 1:04 sáng.

Để truy xuất dữ liệu cho một ngày cụ thể, bạn có thể gọi zrange trên khóa ("" traffic-by-url:URL:YYYY-MM-DD ") để nhận một nhóm được sắp xếp từ ít phổ biến nhất đến phổ biến nhất. Để có được top 10 , ví dụ:bạn sẽ sử dụng zrevrange và cung cấp cho nó phạm vi. Zrevrange trả về một sắp xếp ngược lại, lần truy cập nhiều nhất sẽ ở trên cùng. Một số lệnh được sắp xếp khác có sẵn cho phép bạn thực hiện các truy vấn tốt như phân trang, lấy một phạm vi kết quả theo điểm tối thiểu, v.v.

Bạn có thể chỉ cần thay đổi hoặc mở rộng tên khóa của mình để xử lý các cửa sổ tạm thời khác nhau. Bằng cách kết hợp điều này với zuniontore, bạn có thể tự động cuộn lên đến những khoảng thời gian ít chi tiết hơn. Ví dụ:bạn có thể kết hợp tất cả các khóa trong một tuần hoặc tháng và lưu trữ trong một khóa mới như "traffic-by-url:month:URL:YYYY-MM". Bằng cách làm như trên trên tất cả các URL trong một ngày nhất định, bạn có thể nhận được hàng ngày. Tất nhiên, bạn cũng có thể có tổng lưu lượng truy cập hàng ngày và số gia tăng đó. Nó chủ yếu phụ thuộc vào thời điểm bạn muốn nhập dữ liệu - ngoại tuyến thông qua nhập tệp nhật ký hoặc như một phần của trải nghiệm người dùng.

Tôi khuyên bạn không nên làm nhiều trong phiên người dùng thực tế vì nó kéo dài thời gian người dùng của bạn trải nghiệm nó (và tải máy chủ). Cuối cùng đó sẽ là một cuộc gọi dựa trên mức lưu lượng truy cập và tài nguyên.

Như bạn có thể tưởng tượng, sơ đồ lưu trữ ở trên có thể được áp dụng cho bất kỳ chỉ số dựa trên bộ đếm nào mà bạn muốn hoặc xác định. Ví dụ:thay đổi URL thành userID và bạn có theo dõi mỗi người dùng.

Bạn cũng có thể lưu trữ nhật ký thô trong Redis. Tôi làm điều này cho một số nhật ký lưu trữ chúng dưới dạng chuỗi JSON (tôi có chúng dưới dạng cặp khóa-giá trị). Sau đó, tôi có quy trình thứ hai kéo chúng ra và thực hiện mọi việc với dữ liệu.

Để lưu trữ các lần truy cập thô, bạn cũng có thể sử dụng các tập hợp được sắp xếp bằng cách sử dụng Thời gian kỷ nguyên làm thứ hạng và dễ dàng lấy cửa sổ tạm thời bằng cách sử dụng các lệnh zrange / zrevrange. Hoặc lưu trữ chúng trong một khóa dựa trên ID người dùng. Các bộ sẽ hoạt động cho điều này, cũng như các bộ được sắp xếp.

Một tùy chọn khác mà tôi chưa thảo luận nhưng đối với một số dữ liệu của bạn có thể hữu ích là lưu trữ dưới dạng băm. Ví dụ, điều này có thể hữu ích để lưu trữ thông tin chi tiết về một phiên nhất định.

Nếu bạn thực sự muốn dữ liệu trong cơ sở dữ liệu, hãy thử sử dụng tính năng Pub / Sub của Redis và nhờ một người đăng ký phân tích cú pháp dữ liệu đó thành một định dạng được phân tách và kết xuất vào một tệp. Sau đó, có một quy trình nhập sử dụng lệnh sao chép (hoặc lệnh tương đương cho DB của bạn) để nhập hàng loạt. DB của bạn sẽ cảm ơn bạn.

Một lời khuyên cuối cùng ở đây (có lẽ tôi đã dành đủ thời gian tinh thần) là hãy sử dụng một cách thận trọng và tự do lệnh hết hạn. Sử dụng Redis 2.2 hoặc mới hơn, bạn có thể đặt thời hạn trên các phím bộ đếm thậm chí. Ưu điểm lớn ở đây là tự động dọn dẹp dữ liệu. Hãy tưởng tượng bạn làm theo một sơ đồ như tôi đã nêu ở trên. Bằng cách sử dụng các lệnh hết hạn, bạn có thể tự động xóa dữ liệu cũ. Có lẽ bạn muốn số liệu thống kê hàng giờ lên đến 3 tháng, sau đó chỉ số liệu thống kê hàng ngày; số liệu thống kê hàng ngày trong 6 tháng sau đó chỉ số liệu thống kê hàng tháng. Chỉ cần hết hạn các khóa hàng giờ của bạn sau ba tháng (86400 * 90), hàng ngày của bạn ở mức 6 (86400 * 180) và bạn sẽ không cần phải dọn dẹp.

Để gắn thẻ địa lý, tôi thực hiện xử lý ngoại tuyến IP. Hãy tưởng tượng một tập hợp được sắp xếp với cấu trúc khóa này:"traffic-by-ip:YYYY-MM-DD" sử dụng IP làm phần tử và sử dụng lệnh zincryby được lưu ý ở trên, bạn sẽ nhận được dữ liệu lưu lượng truy cập trên mỗi IP. Bây giờ, trong báo cáo của bạn, bạn có thể lấy tập hợp đã sắp xếp và thực hiện tra cứu IP. Để tiết kiệm lưu lượng truy cập khi thực hiện các báo cáo, bạn có thể thiết lập một hàm băm trong redis ánh xạ IP đến vị trí bạn muốn. Ví dụ:"geo:country" làm khóa và IP làm thành viên băm với mã quốc gia là giá trị được lưu trữ.

Một lưu ý lớn mà tôi muốn nói thêm là nếu mức lưu lượng truy cập của bạn rất cao, bạn có thể muốn chạy hai phiên bản Redis (hoặc nhiều hơn tùy thuộc vào lưu lượng truy cập). Đầu tiên sẽ là phiên bản ghi, Nó sẽ không có tùy chọn bgsave được kích hoạt. Nếu lưu lượng truy cập của bạn khá cao, bạn sẽ luôn sử dụng bgsave. Đây là những gì tôi đề xuất ví dụ thứ hai. Nó là nô lệ cho cái đầu tiên và nó thực hiện việc lưu vào đĩa. Bạn cũng có thể chạy các truy vấn của mình với máy chủ để phân phối tải.

Tôi hy vọng điều đó cung cấp cho bạn một số ý tưởng và những thứ để thử. Hãy thử với các tùy chọn khác nhau để xem tùy chọn nào phù hợp nhất với nhu cầu cụ thể của bạn. Tôi đang theo dõi rất nhiều số liệu thống kê trên một trang web có lưu lượng truy cập cao (và cả số liệu thống kê nhật ký MTA) trong redis và nó hoạt động rất đẹp - kết hợp với Django và API trực quan của Google, tôi nhận được đồ thị rất đẹp.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Làm thế nào để thực hiện đẩy máy chủ trong khung Flask?

  2. Hậu quả của việc vô hiệu hóa những câu chuyện phiếm, sự hòa đồng và nhịp tim đối với những người làm cần tây là gì?

  3. Microsoft.Extensions.Caching.Redis chọn cơ sở dữ liệu khác với db0

  4. Bế tắc khi sử dụng Aggregator + Redis

  5. Kết nối với máy chủ redis từ xa